Mematikan Kamera Pada Perangkat Android Dengan Device Administrator API

Walaupun Android adalah turunan dari sistem dari Linux, pengguna biasanya tidak memiliki akses ke user root seperti di Linux. Hal ini dilakukan demi alasan keamanan. Sebagai alternatifnya, aplikasi dapat menggunakan Device Administration API untuk memiliki kemampuan yang lebih spesial dibandingkan aplikasi lainnya. Bila sebuah aplikasi didaftarkan sebagai device administrator, aplikasi tersebut akan memiliki kemampuan untuk mengatur policy pada perangkat. Salah satu policy yang boleh diatur oleh device administrator adalah mematikan fasilitas kamera (tersedia sejak Android 4.0).

Sebagai latihan, saya akan membuat aplikasi yang dapat mematikan atau mengaktifkan kamera di perangkat Android. Saya akan mulai dengan sebuah proyek baru di Android Studio. Sebuah aplikasi device administrator harus memiliki sebuah class yang diturunkan dari DeviceAdminReceiver. Sebagai latihan, saya membuat implementasi tersebut seperti pada kode program berikut ini:

public class MyCameraDeviceAdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "MyCameraDeviceAdmin diaktifkan", Toast.LENGTH_LONG).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "MyCameraDeviceAdmin akan dimatikan!";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "MyCameraDeviceAdmin dimatikan", Toast.LENGTH_LONG).show();
    }

}

DeviceAdminReceiver pada dasarnya adalah sebuah broadcast receiver. Oleh sebab itu, saya perlu mendaftarkannya pada AndroidManifest.xml seperti berikut ini:

<manifest ...>

  <application ...>
     ...
     <receiver android:name=".MyCameraDeviceAdminReceiver"
        android:label="MyCamera Device Administrator"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data android:name="android.app.device_admin" android:resource="@xml/mycamera_device_admin" />
           <intent-filter>
              <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
           </intent-filter>
     </receiver>
  </application>

</manifest>

Deklarasi broadcast receiver di atas membutuhkan referensi ke file XML lainnya. Untuk itu, saya membuat sebuah file bernama mycamera_device_admin.xml di folder xml pada resources dengan isi seperti berikut ini:

<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies>
        <disable-camera />
    </uses-policies>
</device-admin>

Deklarasi di atas menunjukkan bahwa aplikasi device administrator ini hanya mengatur policy yang berkaitan dengan mematikan penggunaan kamera.

Setelah men-deploy aplikasi ke perangkat, saya bisa mendaftarkan aplikasi device administrator ini dengan memilih menu Settings, Security, Device administrators. Saya akan menemukan device administrator saya seperti pada gambar berikut ini:

Melihat daftar device administrator

Melihat daftar device administrator

Untuk mengaktifkannya, saya dapat memberikan tanda centang pada device administrator yang saya buat seperti pada gambar berikut ini:

Mengaktifkan device administrator

Mengaktifkan device administrator

Bila saya memilih Activate, kode program di onEnabled() akan dipanggil. Hal ini terlihat dari toast yang muncul seperti pada gambar berikut ini:

Device administrator yang aktif

Device administrator yang aktif

Bila saya menghilangkan tanda centang dan memilih Deactivate, sebuah dialog akan muncul sesuai dengan pesan yang dikembalikan oleh onDisableRequested() seperti pada gambar berikut ini:

Me-nonaktif-kan device administrator

Me-nonaktif-kan device administrator

Setelah itu kode program onDisabled() akan dipanggil, seperti yang terlihat pada gambar berikut ini:

Device administrator yang tidak aktif

Device administrator yang tidak aktif

Walaupun sekarang saya sudah bisa mendaftarkan aplikasi tersebut sebagai device administrator, tidak ada apa-apa yang dikerjakan olehnya. Aplikasi saya hanya menampilkan toast dan tidak menghubungi sebuah server yang berisi pusat kebijakan. Hal ini karena saya ingin aplikasi ini dikendalikan oleh pengguna melalui sebuah activity.

Sebagai contoh, saya akan membuat sebuah activity baru dengan nama MainActivity. Activity ini akan memungkinkan pengguna untuk mengendalikan apakah kamera hendak diaktifkan atau tidak, seperti yang terlihat pada kode program berikut ini:

public class MainActivity extends Activity implements CompoundButton.OnCheckedChangeListener {

    private DevicePolicyManager pm;
    private MyCameraDeviceAdminReceiver myCameraDeviceAdminReceiver;
    private ComponentName adminName;
    private CheckBox statusKamera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myCameraDeviceAdminReceiver = new MyCameraDeviceAdminReceiver();
        pm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

        // Tampilkan dialog untuk mendaftarkan aplikasi ini sebagai device administrator
        // bila belum pernah didaftarkan sebelumnya.
        adminName= myCameraDeviceAdminReceiver.getWho(this);
        if (!pm.isAdminActive(adminName)) {
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminName);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                "Anda harus menjadikan aplikasi ini sebagai device administrator");
            startActivity(intent);
        }

        //
        // Tampilan hanya berupa sebuah checkbox untuk mengaktifkan dan mematikan
        // fasilitas kamera.
        //
        LinearLayout layout = new LinearLayout(this);
        statusKamera = new CheckBox(this);
        statusKamera.setText("Jangan aktifkan kamera di perangkat ini!");
        statusKamera.setOnCheckedChangeListener(this);
        statusKamera.setChecked(pm.getCameraDisabled(null));
        layout.addView(statusKamera);
        setContentView(layout);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (pm.isAdminActive(adminName)) {
            pm.setCameraDisabled(adminName, isChecked);
        } else {
            Toast.makeText(this, "Anda harus mendaftarkan aplikasi ini sebagai device administrator terlebih dahulu",
                Toast.LENGTH_SHORT).show();
        }
    }
}

Pada saat activity ini dijalankan, ia akan memeriksa apakah device administrator yang sebelumnya saya buat sudah aktif atau tidak dengan menggunakan method isAdminActive() dari DevicePolicyManager. Bila device administrator belum aktif, ia akan membuat Intent baru yang akan menampilkan kotak dialog pendaftaran device administrator tersebut (sehingga pengguna tidak perlu memilih masuk ke menu Settings untuk mengaktifkannya).

Tampilan program ini cukup sederhana karena ia hanya berisi sebuah CheckBox seperti pada gambar berikut ini:

Tampilan launcher activity

Tampilan launcher activity

Bila CheckBox tersebut dimodifikasi oleh pengguna, method setCameraDisabled() dari DevicePolicyManager akan dipanggil untuk mengatur apakah kamera boleh digunakan atau tidak.

Sebagai contoh, bila saya melarang penggunaan kamera, maka pada saat saya berusaha menjalankan aplikasi yang menggunakan kamera, saya akan menemukan pesan kesalahan seperti Security policy restricts use of Camera.

Iklan

Memahami Authentication dan Auditing Di MySQL Server

Salah satu yang unik pada MySQL Server adalah nama akun untuk pengguna memiliki syntax seperti 'nama_user'@'nama_host'. Dengan demikian, sebuah nama_user yang sama boleh dipakai lebih dari sekali untuk nama_host yang berbeda. Bahkan nilai nama_user boleh dikosongkan (anonymous user) sehingga nama_host tertentu boleh mengakses database tanpa perlu memberikan nama_user.

Nilai nama_host dipakai untuk melakukan validasi host asal dimana user melakukan koneksi. Bila saya tidak menyertakan nama_host pada saat membuat pengguna, maka nilai tersebut dianggap sebagai % yang berarti pengguna boleh melakukan koneksi dari mana saja.

Sebagai contoh, saya bisa membuat sebuah user yang hanya boleh diakses dari IP 192.168.56.0 sampai 192.168.56.255 dengan menggunakan perintah SQL seperti berikut ini:

CREATE USER 'inventory'@'192.168.56.0/255.255.255.0';

Tentu saja membatasi host asal tidak cukup! Saya perlu memberikan password sehingga pengguna perlu memberikan nilai password yang benar saat melakukan koneksi. Untuk itu, saya bisa menambahkan klausa IDENTIFIED BY seperti pada perintah SQL berikut ini:

CREATE USER 'inventory'@'192.168.56.0/255.255.255.0'
IDENTIFIED BY 'password_12345';

Salah satu masalah dengan perintah di atas adalah saya mengetik nilai password secara polos. Ini memiliki resiko tersendiri, terutama bila saya menyimpan perintah ini dalam file SQL sebagai cadangan untuk dikerjakan suatu hari nanti. Oleh sebab itu, akan lebih baik bila saya menyimpan password dalam bentuk hash. Untuk mengetahui nilai hash dari sebuah password polos, saya dapat memberikan perintah SQL berikut ini:

SELECT PASSWORD('password_12345');

Saya kemudian bisa memakai hash yang dihasilkan perintah di atas sebagai password pada saat membuat user:

CREATE USER 'inventory'@'192.168.56.0/255.255.255.0' 
IDENTIFIED BY PASSWORD '*E758CB9320D032FDC632D7FAB56BE5A50920BB89';

Untuk tingkat keamanan yang lebih tinggi, MySQL Server sejak versi 5.6.6 memiliki fitur sha256_password (http://dev.mysql.com/doc/refman/5.6/en/sha256-authentication-plugin.html) sebagai authentication plugin. Plugin ini mensyaratkan penggunaan SSL atau RSA pada saat melakukan koneksi guna meng-enkripsi password yang dikirim dari client ke server. MySQL Community Edition (versi gratis yang di-build dengan yaSSL) tidak mendukung enkripsi RSA sehingga untuk menggunakan sha256_password dibutuhkan SSL. Penggunaan SSL bisa membuat database menjadi lebih lambat akibat beban enkripsi & deskripsi koneksi. Ini adalah pengorbanan yang wajar bila menginginkan keamanan yang lebih baik. Sementara itu, MySQL Enterprise Edition (di-build dengan OpenSSL) memiliki dukungan enkripsi RSA sehingga sha256_password dapat dipakai tanpa mengaktifkan SSL.

Selain itu, bagi pengguna Windows yang memakai MySQL 5.6.10 versi berbayar, terdapat Windows Native Authentication Plugin dimana pengguna dapat login ke server database berdasarkan informasi akun Windows. Dengan demikian, pengguna tidak perlu memberikan password lagi karena ia akan dikenali berdasarkan akun di sistem operasi Windows yang sedang dipakainya.

Langkah berikutnya setelah membuat pengguna adalah menentukan apa saja yang boleh diakses oleh penguna tersebut. Secara default, pengguna yang baru dibuat hanya memiliki akses ke database information_schema dan test. Pengguna tersebut juga tidak memiliki hak untuk membuat database baru. Oleh sebab itu, saya perlu memberikan hak akses atas sebuah database yang sudah ada dengan memberikan perintah SQL seperti berikut ini:

GRANT ALL ON inventory.* TO 'inventory'@'192.168.56.0/255.255.255.0';

Selain itu, bila saya ingin seluruh komputer dengan IP 192.168.56.0 sampai 192.168.56.255 boleh membaca isi tabel pesan di database inventory dan tidak boleh menghapus atau mengubah isinya, saya dapat memberikan SQL seperti berikut ini:

CREATE USER ''@'192.168.56.0/255.255.255.0';
GRANT SELECT ON inventory.pesan TO ''@'192.168.56.0/255.255.255.0';

Perintah SQL di atas akan menyebabkan komputer dengan IP 192.168.56.0 sampai 192.168.56.255 boleh melakukan koneksi ke database tanpa harus memberikan nama user dan password. Tetapi, bila melakukan koneksi secara anonymous seperti ini, mereka hanya bisa melihat isi tabel pesan saja:

C:\>mysql -h mydatabase.com

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| inventory          |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> use inventory;
Database changed

mysql> show tables;
+---------------------+
| Tables_in_inventory |
+---------------------+
| pesan               |
+---------------------+
1 row in set (0.00 sec)

mysql> delete from pesan;
ERROR 1142 (42000): DELETE command denied to user ''@'192.168.56.30' for table 'pesan'

Salah satu fasilitas lainnya yang penting dalam mengamankan database adalah auditing. Fasilitas ini memungkinkan database administrator untuk mengetahui kapan pengguna melakukan koneksi dan apa saja query yang diberikan pengguna tersebut. Pada MySQL Server, auditing dilakukan dengan bantuan Audit Server Plugin. Sayang sekali, walaupun MySQL Server menyediakan API untuk menulis Audit Server Plugin, satu-satunya implementasi resmi berupa MySQL Audit Log Plugin hanya tersedia di MySQL Enterprise Edition (versi berbayar).

Sebagai alternatif untuk melakukan auditing tanpa harus beralih ke versi berbayar, saya dapat menggunakan Audit Plugin dari MariaDB di MySQL Server. Walaupun merupakan bagian dari MariaDB, Audit Plugin diprogram berdasarkan Audit Server Plugin API dari MySQL Server dan telah diuji untuk MySQL Server. Tentu saja alasan utama lain untuk memakainya di MySQL Server adalah karena ia dapat di-download secara gratis di https://mariadb.com/products/connectors-plugins.

Pada saat tulisan ini dibuat, versi terakhir Audit Plugin dari MariaDB adalah 1.1.8. Setelah men-download dan men-extract file server_audit-1.1.8.zip, saya perlu memindahkan file server_audit.dll di folder windows-32 (karena saya memakai Windows 32-bit) ke lokasi direktori plugin milik MySQL Server. Saya dapat mengetahui lokasi direktori plugin dengan memberikan perintah SQL seperti berikut ini:

SHOW VARIABLES LIKE 'plugin_dir';

Setelah men-copy file server_audit.dll pada direktori bersangkutan, saya dapat men-install plugin dengan memberikan perintah SQL seperti berikut ini:

INSTALL PLUGIN server_audit SONAME 'server_audit.dll';

Setelah ini, MariaDB Audit Plugin akan aktif. Saya akan menemukan beberapa variabel baru seperti berikut ini:

mysql> SHOW VARIABLES LIKE 'server_audit%';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           |                       |
| server_audit_excl_users       |                       |
| server_audit_file_path        | server_audit.log      |
| server_audit_file_rotate_now  | OFF                   |
| server_audit_file_rotate_size | 1000000               |
| server_audit_file_rotations   | 9                     |
| server_audit_incl_users       |                       |
| server_audit_logging          | OFF                   |
| server_audit_mode             | 1                     |
| server_audit_output_type      | file                  |
| server_audit_syslog_facility  | LOG_USER              |
| server_audit_syslog_ident     | mysql-server_auditing |
| server_audit_syslog_info      |                       |
| server_audit_syslog_priority  | LOG_INFO              |
+-------------------------------+-----------------------+
14 rows in set (0.00 sec)

Karena nilai server_audit_logging adalah OFF, saya perlu mengaktifkannya dengan memberikan perintah SQL berikut ini:

SET GLOBAL server_audit_logging = ON;

Untuk perubahan yang permanen, saya perlu menyimpan nilai variabel di file konfigurasi my.cnf.

Sekarang, saya dapat melihat status auditing dengan memberikan perintah SQL seperti berikut ini:

mysql> SHOW STATUS LIKE 'server_audit%';
+----------------------------+------------------+
| Variable_name              | Value            |
+----------------------------+------------------+
| server_audit_active        | ON               |
| server_audit_current_log   | server_audit.log |
| server_audit_last_error    |                  |
| server_audit_writes_failed | 0                |
+----------------------------+------------------+
4 rows in set (0.00 sec)

Terlihat bahwa MariaDB Audit Plugin akan menulis hasil audit ke file dengan nama server_audit.log. Pada instalasi default MySQL Server di Windows, file ini terletak di folder seperti C:\ProgramData\MySQL\MySQL Server 5.6\data.

MariaDB Audit Plugin menyediakan 3 jenis informasi yang di-audit, yaitu CONNECT, QUERY dan TABLE. Pada MySQL Server, hanya CONNECT dan QUERY yang dapat dipakai. Sebagai contoh, bila saya hanya ingin merekam aktifitas koneksi dan mengabaikan aktifitas query, saya dapat memberikan perintah SQL seperti berikut ini:

SET GLOBAL server_audit_events = 'CONNECT';

Bila ada pengguna yang melakukan koneksi atau memutuskan koneksi, saya akan memperoleh baris baru di file server_audit.log yang isinya seperti berikut ini:

20141207 20:00:46,mydatabase.com,inventory,192.168.56.30,12,0,CONNECT,,,0
20141207 20:01:06,mydatabase.com,inventory,192.168.56.30,12,0,DISCONNECT,,,0

Informasi di atas terdiri atas waktu, nama server database yang dihubungi, nama user dan lokasi host asal yang melakukan koneksi, id koneksi, dan informasi seperti CONNECT & DISCONNECT.

Baris yang sangat penting untuk dipantau adalah baris dimana pengguna gagal melakukan koneksi, yang terlihat seperti berikut ini:

20141207 18:06:06,mydatabase.com,inventory,192.168.56.30,13,0,FAILED_CONNECT,,,1045
20141207 18:06:06,mydatabase.com,inventory,192.168.56.30,13,0,DISCONNECT,,,0

Informasi FAILED_CONNECT menunjukkan bahwa ada pengguna yang gagal melakukan koneksi. Nilai 1045 adalah kode kesalahan yang menyebabkan kegagalan koneksi. Berdasarkan informasi di http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html, nilai ini adalah ER_ACCESS_DENIED_ERROR yang memiliki pesan seperti Access denied for user '%s'@'%s' (using password: %s). Hal ini menunjukkan bahwa pengguna gagal melakukan koneksi karena memberikan password yang salah. Bila baris seperti ini sering terlihat, maka ada kemungkinan pengguna (atau hacker) sedang berusaha mengakses sesuatu yang bukan hak-nya.

Mendeteksi sensor oleh ISP dengan OONI

Salah satu indikasi adanya diktator adalah sensor terhadap informasi. Dengan melakukan pembodohan seperti menghalangi pendidikan dan akses terhadap informasi, diktator berharap dapat mempertahankan posisinya. Diktator juga cenderung melakukan penyadapan karena ia ingin segalanya berada dalam kendali. Ia perlu melakukan semua ini karena ia tidak akan sanggup bertahan pada persaingan yang bebas, jujur dan adil.

Open Observatory of Network Interference (https://ooni.torproject.org/) adalah sebuah global observation network yang dikembangkan untuk mendeteksi sensor dan penyadapan yang dilakukan oleh ISP. Pengguna melakukan serangkaian pengujian melalui ooniprobe yang menghubungi server ooni-backend. Semakin banyak jumlah pengguna dan semakin sering pengguna melakukan pengujian, maka peneliti jaringan dapat semakin memastikan praktek sensor dan penyadapan yang dilakukan oleh ISP atau pihak lainnya. Laporan hasil pengujian dapat diakses secara terbuka oleh siapa saja di https://ooni.torproject.org/reports/0.1/ (dikelompokkan berdasarkan negara).

Saya akan mulai dengan melakukan instalasi ooniprobe pada Debian Live (yang merupakan versi stable bukan testing). Pada saat tulisan ini dibuat, versi terbaru ooniprobe di wheezy-backport adalah 1.1.1-1. Saya dapat menemukan versi yang lebih baru di PyPI yang sudah mencapai 1.2.2. Oleh sebab itu, saya akan mencoba men-install ooniprobe yang ada di PyPI. Sebelumnya, saya perlu men-download beberapa package yang dibutuhkan terlebih dahulu dahulu dengan membuka root terminal dan memberikan perintah berikut ini:

# apt-get update && apt-get install python-dev python-pip python-dumbnet libpcap libgeoip-dev libffi-dev tor

Setelah ini, saya dapat men-download ooniprobe di PyPI melalui pip dengan perintah seperti berikut ini:

# pip install ooniprobe

Setelah proses instalasi selesai, saya dapat melihat apa saja pengujian yang dapat dilakukan oleh ooniprobe dengan memberikan perintah berikut ini:

# ooniprobe -s

Perintah di atas juga akan membuat file konfigurasi ooniprobe.conf di lokasi ~/.ooni.

Sebelum memulai pengujian, saya akan men-download resources terbaru dengan memberikan perintah berikut ini:

# ooniresources --update-inputs --update-geoip

Pengujian yang dilakukan oleh OONI dideskripsikan dalam file yang disebut sebagai deck. Dengan demikian, sebuah deck adalah kumpulan dari net test. Saya dapat melihat deck bawaan di di lokasi /usr/share/ooni/decks:

# ls /usr/share/ooni/decks
complete.deck  complete_no_root.deck  fast.deck  fast_no_root.deck  mlab.deck

Saya juga membuat deck khusus untuk mewakili negara saya dengan memberikan perintah berikut ini:

# oonideckgen
Unable to lookup the probe IP via traceroute
Looking up your IP address via torproject
Found your IP via a GeoIP service: x.x.x.x
Deck written to /home/user/deck-id/0.0.1-id.user.deck
Run ooniprobe like so:
ooniprobe -i /home/user/deck-id/0.0.1-id-user.deck

Perintah di atas akan menghasilkan folder dengan nama deck-id. id adalah kode negara untuk Indonesia berdasarkan standar ISO 3166-2. oonideckgen memperoleh informasi mengenai negara saya melalui layanan GeoIP.

Sesuai dengan output perintah oonideckgen, saya dapat memulai pengujian dengan memberikan perintah berikut ini:

# ooniprobe -i /home/user/deck-id/0.0.1-id-user.deck

Setelah pengujian selesai dilakukan, ooniprobe akan menghasil file yaml yang berisi informasi hasil untuk masing-masing net test. File ini akan dikirim ke server laporan sehingga dapat diakses oleh publik di lokasi https://ooni.torproject.org/reports/.

Pengujian blocking/dns_consistency akan mendeteksi sensor yang dilakukan melalui DNS. Ini adalah metode sensor yang sederhana dimana ISP mengalihkan request ke URL yang sah menjadi ke lokasi yang berbeda. Pengujian ini bisa menghasilkan false positive karena website modern biasanya memiliki load-balancing yang akan mengalihkan request ke server terdekat sesuai dengan wilayah geografis.

Pengujian blocking/http_requests akan mendeteksi sensor yang dilakukan secara MITM (yang masuk dalam kategori penyadapan). Pengujian ini akan membandingkan request HTTP normal dari komputer dan request HTTP melalui jaringan Tor. Bila blocking/http_requests mendeteksi perbedaan, ia akan menampilkan pesan seperti:

The two body lengths appear to not match
cencorship could be happening
Headers appear to *not* match

Jaringan Tor adalah jaringan ‘bawang’ dimana saya tidak menghubungi server tujuan secara langsung melainkan ‘berputar-putar’ terlebih dahulu ke sesama pengguna Tor. Tujuannya adalah agar ISP tidak mengetahui destinasi pengguna yang sesungguhnya. Kemungkinan sensor dari ISP juga menjadi sangat kecil karena request HTTP versi Tor akan dilakukan oleh komputer lain yang memakai ISP berbeda (sama seperti pada VPN!). Tentu saja ISP lokal masih memiliki peluang melakukan sensor konten bila mereka berhasil memecahkan enkripsi paket yang dilakukan oleh Tor atau men-install backdoor langsung pada komputer pengguna.

Pengujian manipulation/http_invalid_request_line akan berusaha mengirimkan request ilegal dengan harapan proxy penyadap mengembalikan pesan kesalahan. Pada laporan yaml untuk http_invalid_request_line, saya dapat membandingkan nilai received dan send. Bila berbeda, tampering akan bernilai true. Sebagai contoh, pada pengujian yang saya lakukan untuk sebuah ISP lokal, terlihat secara jelas bahwa nilai received berbeda dengan send. Ini menunjukkan bahwa ISP lokal tersebut memiliki proxy yang ‘menyadap’ komunikasi saya.

Pengujian manipulation/http_header_field_manipulation memeriksa apakah header yang dikirim sama persis dengan header yang diterima oleh server; aktifitas penyadapan bisa saja menyebabkan perubahan http header. Sebagai contoh, pada laporan yaml untuk http_header_field_manipulation, saya menemukan bahwa ISP lokal (atau bisa juga router dan modem) yang saya pakai membuang header acCepT-EncODINg karena HTTP header tersebut tidak sampai di server tujuan. Bila dilihat secara positif, ia membuat pengguna terhindar dari serangan seperti CRIME dan BREACH. Bila dilihat secara negatif, ia membuat akses Internet semakin lambat dan konten lebih mudah disadap.

Apa Itu Data Execution Prevention (DEP) Di Windows 7?

Salah satu jenis serangan yang sering dimanfaatkan oleh hacker adalah mencari cara untuk meng-eksekusi apa yang seharusnya hanya sebuah data. Sebagai contoh, pada aplikasi web, sebuah nilai yang seharusnya adalah nama atau alamat dapat disisipi dengan JavaScript yang secara tidak sengaja di-eksekusi saat ditampilkan. Hal serupa juga terjadi pada tingkat sistem operasi. Hacker bisa saja melakukan serangan stack overflow atau heap overflow dengan mengisi data secara berlebihan pada sebuah aplikasi yang tidak aman. Bila data yang berlebihan ini mengandung program (dalam bentuk instruksi mesin), hacker bisa saja menyebabkan instruksi mesin yang ada di stack atau heap tersebut dikerjakan.

Untuk mengatasi permasalahan tersebut, prosesor modern memperkenalkan apa yang disebut sebagai NX bit (No-eXecute bit). Pada prosesor AMD, fitur ini disebut sebagai Enhanced Virus Protection (EVP). Pada prosesor Intel, fitur ini disebut sebagai XD bit (eXecute-Disable bit). Partisipasi prosesor sendirian tidak cukup; manajer memori pada sistem operasi perlu memberikan dukungannya dengan memberi tahu bagian memori mana yang tidak boleh di-eksekusi. Sistem operasi Windows mengimplementasikan dukungan ini dalam bentuk fitur yang diberi nama Data Execution Prevention (DEP). Sedikit membingungkan, bukan? Untuk merujuk ke teknologi yang sama, terdapat beberapa nama berbeda tergantung pada perusahaan besar dibaliknya 😉

Untuk mengatur fitur Data Execution Prevention (DEP) di Windows 7, saya akan mengetik View advanced system settings di menu Start dan memilih item yang muncul. Pada tab Advanced di dialog System Properties yang muncul, saya men-klik tombol Settings… di bagian Performance. Pada dialog yang muncul, saya memilih tab Data Execution Prevention seperti yang terlihat pada gambar berikut ini:

Mengatur fitur DEP di Windows

Mengatur fitur DEP di Windows

Saya dapat melihat program apa saja yang terlindungi oleh DEP melalui Task Manager. Untuk itu, saya perlu memilih menu View, Select Columns… dan memberi tanda centang pada Data Execution Prevention (DEP). Setelah itu, saya dapat melihat dukungan DEP pada kolom Data Execution Prevention di Task Manager seperti pada gambar berikut ini:

Memeriksa status DEP pada aplikasi

Memeriksa status DEP pada aplikasi

Untuk prosesor yang tidak mendukung NX bit, Windows 7 juga menyediakan fasilitas Safe Structured Exception Handling (SEH). Untuk mendukung fasilitas ini, program harus di-compile dengan flag /SAFESEH di Visual C++. Fasilitas ini akan bekerja pada saat terjadi exception dimana ia akan memeriksa apakah exception handler adalah salah satu dari yang sudah terdaftar di dalam program (dan bukan yang barusan di-inject oleh hacker).

Seberapa efektif perlindungan yang diberikan DEP tergantung pada aplikasi yang dijalankan. Aplikasi yang menghasilkan data untuk di-eksekusi sebagai program (misalnya Just-In-Time compiler) tidak dapat memanfaatkan perlindungan DEP. Dengan demikian, walaupun dijalankan pada prosesor dan sistem operasi yang mendukungan DEP, aplikasi tetap rentan terhadap serangan JIT spraying (seperti pada exploit teknologi Adobe PDF Reader dan Adobe Flash).

Memakai Metasploit Framework Di Kali Linux

Metasploit Framework merupakan framework yang paling umum dipakai untuk menguji sebuah exploit. Mengapa dibutuhkan framework dalam membuat kode program exploit? Biasanya kode program exploit memiliki operasi yang umum seperti mengirim request HTTP, membuat server web sebagai pancingan bagi korban, dan sebagainya. Dengan adanya sebuah framework yang universal dan lengkap, tugas membuat kode program exploit menjadi lebih mudah. Selain itu, hal ini juga mempermudah pihak lain untuk menguji exploit yang telah ditulis dengan mudah.

Berdasarkan situs resminya, Metasploit terdiri atas beberapa versi, yaitu Framework, Community, Express, dan Pro. Seluruh versi selain versi Framework memiliki interface berbasis web yang dapat dipakai dengan mudah. Dari seluruh versi yang ada, hanya versi Framework dan Community yang gratis. Selain itu, pengguna versi Community perlu melakukan registrasi terlebih dahulu. Pada artikel ini, saya akan memakai versi Framework yang hanya menyediakan CLI (tampilan berbasis teks). Untuk menjalankannya, saya memilih menu Kali Linux, Exploitation Tools, Metasploit, metasploit framework.

Modul pada Metasploit dikategorikan menjadi encoder, nop generator, exploit, payload, dan auxiliary. Modul exploit mewakili sebuah celah keamanan yang akan diujikan. Celah keamanan ini memungkinkan penyerang untuk mengakses sistem yang diserang. Untuk itu dibutuhkan modul payload yang akan dikerjakan bila modul exploit berhasil menjalankan tugasnya, biasanya berupa shell. Modul auxiliary adalah sesuatu yang mirip seperti exploit tetapi tidak memiliki payload sehingga penyerang tidak dapat bermain-main dengan sistem sasaran secara leluasa (setidaknya untuk saat tersebut ;). Contohnya adalah operasi scanning, serangan yang hanya melumpuhkan server, membuat server palsu atau melakukan password cracking secara offline. Modul nop generator dan encoder dipakai untuk mengelabui sistem pertahanan milik sasaran (seperti antivirus dan IDS/IPS) sehingga sasaran tidak mengetahui bahwa dirinya sedang diserang.

Untuk melihat seluruh modul yang ada, saya dapat memberikan perintah seperti:

msf > show all

Untuk melihat modul untuk kategori tertentu, saya dapat memberikan perintah seperti:

msf > show exploits
...
msf > show auxiliary
...
msf > show payloads
...
msf > show encoders
...
msf > show nops
...

Sebagai latihan, saya akan mencoba mencari IP yang mewakili CCTV DVR di jaringan saya. Saat ini, sudah banyak CCTV DVR yang dapat diakses melalui web. Seberapa besar tingkat keamanan yang diberikan oleh perangkat CCTV DVR yang langsung terkoneksi ke internet? Untuk mencari tahu IP apa saja yang mewakili CCTV DVR, saya perlu menggunakan modul auxiliary scanner/misc/cctv_dvr_login dengan memberikan perintah berikut ini:

msf > use scanner/misc/cctv_dvr_login

Berikutnya, saya perlu melakukan konfigurasi untuk modul tersebut. Untuk melihat apa saja yang dapat diatur, saya memberikan perintah berikut ini:

msf auxiliary(cctv_dvr_login) > show options

Nilai RHOSTS saat ini masih kosong. Saya perlu mengisinya dengan nilai IP yang perlu di-scan. Sebagai contoh, bila saya ingin men-scan IP pada range 192.168.1.0 hingga 192.168.1.255, maka saya dapat memberikan perintah berikut ini:

msf auxiliary(cctv_dvr_login) > set rhosts 192.168.1.0/24

Karena modul auxiliary tidak membutuhkan payload, saya dapat langsung menjalankannya dengan memberikan perintah:

msf auxiliary(cctv_dvr_login) > exploit

Metasploit akan melakukan proses scanning.. Hasilnya adalah tidak ada IP CCTV yang ditemukan!! Hal ini karena perangkat CCTV DVR yang populer di wilayah geografi saya berbeda dengan yang ditemui si pembuat modul. Saya melihat bahwa perangkat CCTV DVR disini sering kali men-ekspos port 554 untuk keperluan streaming. Oleh sebab itu, saya dapat memeriksa apakah sebuah IP membuka port 554 dengan memakai modul auxiliary scanner/portscan/tcp memberikan perintah berikut ini:

msf auxiliary(cctv_dvr_login) > back
msf > use scanner/portscan/tcp
msf auxiliary(tcp) > show options
...
msf auxiliary(tcp) > set ports 554
msf auxiliary(tcp) > set rhosts 192.168.1.0/24
msf auxiliary(tcp) > set threads 5
msf auxiliary(tcp) > exploit

Metasploit pun melaporkan IP dengan port TCP 554 yang terbuka. Kemungkinan besar IP tersebut adalah IP khusus untuk CCTV DVR.

Saya sudah menemukan IP target. Langkah berikutnya adalah menebak password yang dipakai untuk login. Karena proses authentication biasanya dilakukan dengan menggunakan standar dari HTTP, maka saya dapat menggunakan modul auxiliary scanner/http/http_login seperti berikut ini:

msf auxiliary(tcp) > back
msf > use scanner/http/http_login
msf auxiliary(http_login) > show options
...

Sebuah merk CCTV DVR populer di wilayah geografi saya memiliki halaman administrasi berbasis web yang dilengkapi dengan proses login dan captcha. Sekilas terlihat bahwa proses bruteforce atau dictionary attack adalah hal yang tidak mungkin, bukan? Tapi masalahnya CCTV DVR tersebut juga mempublikasi situs web khusus untuk perangkat mobile yang dapat diakses tanpa captcha. Contoh URL yang dapat di-brute force tanpa harus melalui captcha adalah /cgi-bin/guest/Video.cgi?media=JPEG&channel=1. Oleh sebab itu, saya segera melakukan pengaturan seperti berikut ini:

msf auxiliary(http_login) > set auth_uri /cgi-bin/guest/Video.cgi?media=JPEG&channel=1
msf auxiliary(http_login) > set blank_passwords false
msf auxiliary(http_login) > set rhosts 192.168.1.135,200,300
msf auxiliary(http_login) > set stop_on_success true
msf auxiliary(http_login) > exploit
...

Pada perintah di atas, Metasploit akan mencoba melakukan dictionary attack untuk HTTP authentication pada IP 192.168.1.135, 192.168.1.200, dan 192.168.1.300. Bila berhasil, maka saya dapat dengan mudah login ke IP tersebut melalui browser untuk melihat live streaming maupun hasil rekaman CCTV. Pada percobaan ini, saya menemukan cukup banyak CCTV DVR yang dapat diakses dengan mudah karena pengguna memakai password default yang mudah ditebak.

Agar proses pencarian menjadi lebih mudah, saya dapat membuat sebuah modul baru dalam bahasa pemograman Ruby yang dapat mencari IP milik beberapa brand CCTV DVR yang populer (contoh di atas hanya berdasarkan pada perilaku sebuah brand terkenal) dan berusaha untuk login melalui web. Dengan demikian, saya tidak perlu mengulangi langkah di atas lagi setiap kali ingin melakukan pencarian. Ini adalah kelebihan Metasploit sebagai sebuah framework.

Kesimpulannya: Produsen CCTV DVR harus meningkatkan keamanan produknya. Sudah bukan rahasia lagi bila banyak firmware (istilah untuk program yang berjalan di hardware/elektronik) yang ditulis dengan kualitas rendah. Bug dan kesalahan ketik dapat dijumpai dengan mudah pada firmware yang beredar di pasaran. Masalahnya, pengguna akan jarang melakukan update firmware bila ada perbaikan bug (apa ini strategi pasar agar mereka membeli produk baru yang lebih aman? 😉 Pihak yang melakukan instalasi CCTV juga sebaiknya mengedukasi pengguna agar menggunakan password yang lebih aman dan lebih sulit ditebak. Selain itu, mengakses sistem milik orang lain tanpa seizin pemiliknya adalah perbuatan ilegal (mungkin pengecualiannya adalah bila segera memberi tahu pihak terkait atas celah keamanan yang dimilikinya).

Melakukan Fuzz Testing Dengan Kali Linux

Pada saat membuat program, developer mengharapkan pengguna memasukkan input sesuai dengan yang seharusnya. Pada kenyataannya, pengguna (terutama yang iseng) mungkin saja memberikan input yang tidak diharapkan. Lalu, apa yang akan terjadi dengan program bila pengguna memberikan input yang tidak diharapkan? Fuzz testing adalah pengujian yang dilakukan untuk menjawab pertanyaan tersebut. Fuzz testing adalah jenis pengujian black box dimana penguji memberikan berbagai jenis input yang tidak valid pada program.

Kali Linux mem-bundle beberapa tools untuk keperluan fuzz testing yang dapat ditemukan di menu Kali Linux, Vulnerability Analysis, Fuzzing Tools. Saya akan mencoba beberapa tools tersebut.

Tool pertama yang saya temukan, BED, adalah sebuah script Perl yang dipakai untuk menguji penanganan protokol. BED mendukung protokol seperti FTP, SMTP, POP, HTTP, IRC, IMAP, PJL, LPD, FINGER, SOCKS4, dan SOCKS5. Dengan demikian, BED tidak dipakai untuk menguji program seperti aplikasi web, melainkan menguji infrastruktur seperti web server, mail server, FTP server dan sebagainya. BED akan berhenti bila berhasil membuat server yang diuji menjadi down atau crash. Sebagai contoh, saya ingin menguji seberapa handal FTP server di router yang saya pakai. Karena kemampuan pemrosesan di router ekonomis yang terbatas dan jarang sekali upgrade firmware, saya pantas merasa ragu dengan keamanannya. Oleh sebab itu, saya dapat melakukan pengujian dengan perintah seperti berikut ini:

# bed -s FTP -u admin -v password -t 192.168.1.1

BED 0.5 by mjm ( www.codito.de ) &amp; eric ( www.snake-basket.de )

+ Buffer overflow testing:

    ...

+ Formatstring testing:

    ...

* Normal tests
 + Buffer overflow testing:

    ...

 + Formatstring testing:

    ...

 + Unicode testing:

    ...

 + random number testing:

    ...

 + testing misc strings 1:

    ...

 + testing misc strings 2:

    ...

 + testing misc strings 3:

    ...

 + testing misc strings 4:

    ...

 + testing misc strings 5:

 ...


Script BED akan menguji dengan memakai input berupa overflow string ("A" x 1023 atau "\\" x 200), format string (seperti %s%s%s%s atau %.2048d), unicode string (seperti "x99" x 512), large number (seperti -268435455), dan misc string (seperti "/" atau "\r\n"). Khusus pada FTP, ia juga akan menguji apakah directory traversal dengan input seperti "/././.." dimungkinkan atau tidak.

Tool lainnya yang berada dalam kategori ini adalah powerfuzzer. Tool berbasis GUI ini dapat dipakai untuk menguji aplikasi web. Sebagai contoh, saya akan melakukan pengujian pada router saya yang memiliki halaman administrasi dalam bentuk aplikasi web. Saya dapat memberikan perintah berikut ini untuk menjalankan powerfuzzer:

# powerfuzzer

Saya mengisi bagian credentials dengan nama user dan password router. Setelah itu, saya mengisi Target URL dengan lokasi router yaitu di http://192.168.1.1 dan men-klik tombol Scan. powerfuzzer akan bekerja dan menampilkan hasil pemeriksaan setelah selesai. powerpuzzer pada dasarnya adalah script Python yang bekerja mengisi parameter yang dipakai pada parameter pada request GET dan POST dengan nilai yang tidak valid seperti lokasi file (misalnya /etc/passwd atau http://www.google.com/), script (misalnya "a;env", "a);env", dan "/e"), injeksi (dengan payload berupa "\xbf'\"("), javascript (untuk memeriksa XSS), dan string CRLF seperti "http://www.google.com\r\nPowerfuzzer: v1 BETA".

Menariknya, hasil pengujian menunjukkan terdapat celah keamanan XSS pada web administrasi router saya. Bukan hanya itu saja! Dengan mengirim payload tertentu menggunakan method POST pada URL tersebut, router akan crash dan di-restart kembali.

Selain memakai tools yang ada di kategori Fuzzing Tools, bila melakukan fuzz testing pada aplikasi web, saya dapat menggunakan tool yang ada di menu Kali Linux, Web Applications, Web Application Fuzzers. Disini saya dapat menggunakan tool yang lebih ‘user-friendly’ dan berbasis GUI seperti Burp dan Zed Attack Proxy (ZAP).

Fuzz testing pada Burp dilakukan dengan memilih tab Intruder dan memilih salah satu jenis payload yang diujikan seperti Illegal Unicode. Pada ZAP, saya dapat memilih tab Active Scan untuk mencari celah keamanan pada URL yang telah diperoleh oleh spider. ZAP akan melakukan beberapa pemeriksaan, termasuk diantaranya adalah Cross Site Scripting (XSS), SQL Injection dan CRLF injection. Untuk melakukan fuzz testing pada URL tunggal di ZAP, saya perlu memilih sebuah parameter atau header di bagian Request, kemudian men-klik kanan dan memilih Fuzz…. Pada dialog yang muncul, saya dapat memilih fuzzer yang akan dipakai, seperti jbrofuzz/Buffer Overflows, jbrofuzz/Format String Errors, jbrofuzz/Integer Overflows, jbrofuzz/SQL Injection, dan sebagainya.

Memakai Maltego Di Kali Linux

Definisi Open Source Intelligence (OSINT) berdasarkan departemen pertahanan (DoD) Amerika adalah inteligensi yang diperoleh dari informasi yang tersedia untuk publik yang dikumpulkan, diolah dan disebarkan kepada pihak tertentu untuk keperluan intelijen tertentu. Istilah open source disini tidak ada hubungannya dengan kode program. Secara gamblang, OSINT dilakukan dengan mengumpulkan data yang dapat diperoleh secara publik, misalnya sesuatu yang dapat dicari di Google. Berbeda dengan hasil pencarian search engine, sebuah layer presentasi untuk OSINT hanya menampilkan data yang relevan dan dalam format yang mudah ditelusuri sehingga pengguna dapat mencari hubungan dari hasil yang ditemukan.

Maltego adalah sebuah tools yang dibuat dari Java untuk keperluan OSINT. Tool ini telah tersedia di Kali Linux sehingga siap untuk dipakai. Maltego dibedakan menjadi versi komersial (commercial edition) dan versi gratis (community edition). Versi gratis yang tersedia di Kali Linux hanya dapat menampilkan maksimal 12 hasil transformasi dan membutuhkan proses registrasi. Sebagai sebuah front-end untuk server OSINT, Maltego versi gratis hanya dapat memakai layanan server milik Paterva.

Karena versi yang disediakan oleh Kali Linux adalah versi gratis dari Maltego, saya perlu mendaftarkan sebuah akun terlebih dahulu di situs https://www.paterva.com/web6/community/maltego/index.php.

Saya dapat menjalankan Maltego dengan memberikan perintah berikut ini:

# maltego

Pada saat pertama kali dijalankan, layar Welcome to Maltego! akan muncul. Setelah men-klik tombol Next, saya perlu email dan password sesuai dengan yang saya pakai pada saat mendaftar sebelumnya. Setelah men-klik Next, proses login akan dilakukan. Bila berhasil, saya akan memperoleh API key yang aktif selama dua hari (setelah itu, saya perlu mengaktifkannya kembali). Saya kemudian men-klik tombol Next dua kali. Pada langkah terakhir, saya memilih Run a machine (NEW!!) dan men-klik tombol Finish.

Pada dialog yang muncul, saya dapat memilih jenis pekerjaan yang akan dilakukan. Disini saya dapat memilih untuk mencari email address yang berkaitan dengan sebuah perusahaan atau seseorang, tweet yang mengandung kata tertentu, atau informasi lebih lanjut mengenai sebuah URL. Sebagai latihan, saya memilih Footprint L3 untuk mencari informasi lebih lanjut mengenai sebuah domain. Setelah men-klik tombol Next, saya dapat memasukkan nama domain, anggap saja test.com. Setelah itu, saya men-klik tombol Finish.

Saya akan menemukan window Running machine yang sedang bekerja di sisi kanan workspace. Selain itu, terdapat dialog yang memberikan panduan filter dimana saya harus memilih nama domain yang relevan dan men-klik tombol Next agar progress dapat berlanjut.

Maltego akan menampilkan informasi dalam bentuk tree dimana setiap node selalu terhubung ke node lainnya. Setiap node dapat disusun sedemikian rupa oleh pengguna agar mudah dibaca. Sebuah node dalam tree di Maltego disebut sebagai entity. Sebuah entity mewakili informasi seperti nama DNS, alamat email, akun Facebook, nomor telepon, dan sebagainya.

Melihat hubungan antar setiap entity saja tidak cukup. Bila saya men-klik kanan sebuah entity, saya akan menemukan menu Run Transform yang dapat saya pakai untuk menghasilkan sebuah entity baru dari yang sudah ada.

Sebagai contoh, saya ingin mencari tahu apa saja email (berdasarkan hasil search engine) yang berkaitan dengan entity berupa sebuah domain. Bila domain dimiliki oleh sebuah perusahaan, maka biasanya yang dikembalikan adalah alamat email karyawannya. Saya men-klik kanan entity domain tersebut, kemudian memilih Run Transform, Email addresses from Domain, To Emails @domain [using Search Engine]. Maltego akan menciptakan beberapa entity baru yang mewakili email yang ditemukan. Entity baru tersebut akan memiliki link (terhubung) ke entity domain (sebagai sumber transformasi).

Saya kemudian memilih salah satu dari entity yang mewakili email yang ditemukan. Saya kemudian men-klik kanan entity tersebut, memilih Run Transform, Related Email Addresses, All in this set. Maltego akan kembali membuat beberapa entity email baru yang merupakan email yang berhubungan dengan email yang saya pilih. Sama seperti pencarian melalui search engine, tidak selamanya hasil yang dikembalikan akurat, jadi saya masih perlu memilah mana yang relevan. Bila setelah penesuluran saya menemukan entity yang salah, saya dapat memilih entity tersebut beserta seluruh children-nya dengan men-klik tombol Select Children atau Add Children di menu Investigate lalu menekan tombol Del di keyboard. Setelah melakukan transformasi To URLs [Show search engine results], saya menemukan beberapa URL menarik yang berhubungan dengan si pemilik email.

Bila investigasi dilakukan pada entity berupa website, Maltego dapat menampilkan relasi ke entity lain dalam jenis BuiltWith Technology seperti entity Google Webmaster, jQuery, Quantcast Measurement, dan sebagainya.

Kesimpulannya: Saya dapat memperoleh semua informasi yang ada dengan menggunakan search engine, tool whois, menganalisa HTML dan sebagainya. Tetapi cara manual tentu saja lebih repot. Front-end OSINT seperti Maltego mempermudah pekerjaan saya dengan menyediakan cara gampang untuk memahami atau mencari pola dari sekian banyak informasi yang ada.

Mencari Password Dengan Kali Linux

Kali Linux adalah penerus distro BackTrack. Sama seperti BackTrack, distro ini dilengkapi dengan berbagai tools Linux untuk melakukan penetration testing. Dengan Kali Linux, pengguna yang melakukan pengujian keamanan tidak perlu repot men-install atau membuat kode program/script baru. Efek sampingnya: distro Linux seperti ini juga kerap disalahgunakan oleh script kiddie. Istilah script kiddie adalah sebutan untuk orang yang menjalankan tool dan mengikuti panduan tanpa memahami apa yang dilakukan oleh dirinya. Hal ini berbeda dari hacker yang memahami setiap aksi yang dilakukannya dan mampu membuat tool/script-nya sendiri. Dibutuhkan waktu bertahun-tahun untuk mempelajari jaringan komputer dan sistem komputer; script kiddie mengabaikan kenyataan ini dengan memakai tools atau panduan singkat yang ‘script kiddie’-friendly. Fakta bahwa script kiddie dapat men-download dan menjalankan tools yang ada di Kali Linux secara bebas menunjukkan bahwa ancaman terhadap keamanan komputer semakin besar.

Pada kesempatan ini, saya akan mencoba beberapa tool di Kali Linux yang dapat dipakai untuk mencari password (menguji apakah password aman). Sebagai percobaan, saya akan mencoba mencari password pada router yang saya pakai. Router tersebut (IP 192.168.1.1) memiliki interface web dengan memakai basic authentication dari HTTP.

Untuk mencari password router tersebut, saya dapat memakai tool yang ada di Applications, Kali Linux, Password Attacks, Online Attacks. Saya dapat menggunakan salah satu dari tool berikut ini: burpsuite, hydra, medusa, ncrack, patator, phrasendrescher. Tool tersebut pada dasarnya memiliki fungsi umum yang sama, hanya dibuat oleh pihak yang berbeda. Saya akan memakai tool hydra pada percobaan ini.

Secara garis besar, ada dua cara untuk menemukan sebuah password.

Cara pertama adalah dengan mencoba seluruh kombinasi password yang ada. Cara ini membutuhkan waktu yang sangat lama dan hampir mustahil bila pengguna memakai password yang panjang. Sebagai contoh, anggap saja pengguna membuat password 6 karakter yang terdiri atas huruf A sampai Z. Kombinasi password yang mungkin dapat dihitung dengan rumus 26^6 (26 x 26 x 26 x 26 x 26 x 26) dimana hasilnya adalah 308.915.776 kombinasi. Bila seandainya dalam 1 menit saya dapat memproses 600 kombinasi, maka waktu yang saya butuhkan untuk menemukan password adalah 514.859 menit atau 8.580 jam atau 358 hari. Butuh waktu hampir setahun. Ini masih belum menyertakan karakter seperti huruf kecil, angka dan simbol. Btw, kinerja brute force masih dapat ditingkatkan lagi dengan memakai mesin yang lebih cepat dan mendistribusikannya pada beberapa komputer yang berbeda.

Untuk melakukan brute force dengan hydra, saya dapat memberikan perintah seperti berikut ini:

# hydra -l admin -x 6:6:A 192.168.1.1 http-get /

Pada perintah di atas, saya menganggap nama user selalu adalah admin. Tool tersebut akan mencoba kombinasi 6 karakter dari seluruh huruf kapital A-Z. Bila saya ingin men-pause operasi brute force, saya dapat menekan tombol CTRL+C. Hydra akan membuat file hydra.restore di lokasi direktori yang sedang aktif. Untuk melanjutkan proses brute foce, saya cukup memberikan perintah berikut ini:

# hydra -R

Kesimpulannya: Walaupun teknik brute force memiliki hasil yang lebih pasti, ia membutuhkan waktu yang lama.

Cara kedua adalah dengan menggunakan daftar kata (dictionary attack). Pada metode ini, daripada mencoba kombinasi karakter yang mungkin, saya mencoba menggunakan password yang umum digunakan (misalnya berdasarkan daftar kata di kamus). Kali Linux sudah menyediakan daftar password umum di lokasi /usr/share/wordlists. Saya hanya perlu men-unzip-nya dengan perintah seperti berikut ini:

# cd /usr/share/wordlists/
# gunzip rockyou.txt.gz
# ls -l
total 136644
-rw-r--r-- 1 root root 139921507 Mar  3  2013 rockyou.txt

Selain itu, tool ncrack dilengkapi beberapa daftar password yang dapat saya pakai di tools lainnya. Saya dapat melihatnya dengan perintah seperti berikut ini:

# cd /usr/share/ncrack
# ls -hs
total 923K
6.5K common.usr
3.5K default.usr
512  minimal.usr
512  ncrack-services
402K top50000.pwd
46K  default.pwd
22K  jtr.pwd
385K myspace.pwd
58K  phpbb.pwd

Untuk menggunakan sebuah file berisi daftar kata sebagai password pada hydra, saya memberikan perintah seperti berikut ini:

# hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.1.1 http-get /

Teknik ini tidak selalu berhasil, tetapi biasanya dicoba terlebih dahulu sebelum penyerang nekat menggunakan brute force.

Pada kategori Password Attacks, Online Attacks, juga ada tool seperti burpsuite, webscarab, dan zaproxy. Ketiganya adalah aplikasi Java dengan GUI yang bekerja sebagai web proxy yang dilengkapi fasilitas spider, scanner, dan sebagainya. Versi burpsuite yang ada pada Kali Linux adalah versi free edition dengan kemampuan yang lebih terbatas. Walaupun demikian, tab Intruder tetap dapat dipakai untuk mendefinisikan payload berdasarkan HTTP request yang di-capture oleh proxy tersebut. Pilih payload type berupa Brute forcer untuk melakukan brute force atau pilih Runtime file untuk melakukan dictionary attack berdasarkan file daftar kata. Sayangnya, pada versi free edition, terdapat batas waktu saat melakukan eksekusi ‘serangan’.

Kesimpulannya: Gunakan password dengan jumlah karakter yang panjang dan beberapa kombinasi karakter (huruf, angka, dan simbol) untuk menjaga password dari serangan brute force. Jangan memakai password umum seperti abc123, iloveu, h3av3n dan sebagainya karena mereka biasanya sudah terdaftar di kamus yang dipakai untuk dictionary attack. Selain itu, sebagai developer, jangan membolehkan pengguna untuk memasukkan password yang salah berkali-kali tanpa batas (karena bisa saja proses brute force atau dictionary attack sedang berlangsung).

Mengelola User Di Oracle TimesTen

Hari ini saya mendapatkan sebuah trophy yang mengingatkan bahwa usia blog ini sudah mencapai lima tahun:

Happy anniversary!

Happy anniversary!

Lima tahun yang lalu, saya berhenti menulis blog subjektif yang penuh lelucon, komentar dan opini pribadi 🙂  Saya kemudian mendaftar di WordPress.com dan membuat blog TheSolidSnake ini.  Saya mulai belajar menulis secara serius dan objektif.   Apalagi, seorang sosok eksentrik di Indonesia, R*y S*ryo, pernah meremehkan blogger dengan menyatakan bahwa: “Blog tidak bertanggung jawab, bahkan blogger itu tukang tipu”.  Oleh sebab itu, saya tidak ingin menjadi blogger penerjemah yang hanya menerjemahkan dokumentasi dari bahasa Inggris menjadi bahasa Indonesia.   Visi saya saat itu adalah menuliskan informasi yang sulit diperoleh dalam bahasa Indonesia atau sesuatu yang menarik bagi saya.   Kini, hasilnya setelah lima tahun, adalah sebuah blog yang membosankan dan terkadang sulit dicerna.  Tulisan pertama saya di blog ini adalah mengenai salah satu produk Oracle yang sangat populer di lingkungan kerja, Oracle Database.  Hari ini saya kembali lagi bereksperimen dengan produk database lainnya dari Oracle yang bernama Oracle TimesTen.

Oracle TimesTen mengenali dua jenis user, yaitu internal user dan external user.   Seorang external user yang men-install TimesTen boleh melakukan apa saja terhadap database tersebut sehingga ia disebut juga sebagai instance administrator.   Untuk melihat seluruh user yang ada, saya dapat menggunakan perintah SQL berikut:

C:\>ttIsql LATIHAN

Command> SELECT * FROM SYS.ALL_USERS;
< SYS, 0, 2013-09-13 22:36:07.442000 >
< TTREP, 2, 2013-09-13 22:36:07.442000 >
< SYSTEM, 3, 2013-09-13 22:36:07.442000 >
< GRID, 4, 2013-09-13 22:36:07.442000 >
< SOLIDSNAKE, 10, 2013-09-13 22:36:07.442000 >
5 rows found.

Internal user adalah user yang dibuat dan disimpan di dalam database TimesTen itu sendiri melalui perintah SQL CREATE USER.   Pada hasil query di atas, terlihat bahwa Oracle TimesTen secara otomatis membuat 4 internal user, yaitu SYS, TTREP, SYSTEM dan GRID.   Mereka adalah user yang dipakai oleh TimesTen itu sendiri.

External user adalah user yang disimpan di sistem operasi.   Pada hasil query di atas, user SOLIDSNAKE adalah external user.   TimesTen tidak menyimpan password untuk external user karena mereka dikelola oleh sistem operasi.   TimesTen juga tidak meminta password untuk external user karena sebelum menjalankan TimesTen pastinya mereka sudah login terlebih dahulu di sistem operasi.

Bila saya melakukan koneksi tanpa memberikan atribut UID (nama user), maka user yang dipakai adalah external user dengan nama yang sama sesuai dengan user di sistem operasi.   Hanya external user selaku instance administrator yang boleh melakukan koneksi ke database untuk pertama kalinya (ingat bahwa koneksi pertama kali akan memindahkan file database ke memori).    Sebagai contoh, pada perintah di atas, saya melakukan koneksi ke database sebagai instance administrator karena saya sedang login di Windows 7 sebagai user yang men-install Oracle TimesTen.

Untuk membuat sebuah internal user baru, saya dapat menggunakan perintah SQL seperti berikut ini:

C:\>ttIsql LATIHAN

Command> CREATE USER solid IDENTIFIED BY "snake";

User created.

Command> GRANT CREATE SESSION TO solid;

Untuk mendaftarkan sebuah external user baru, saya dapat menggunakan perintah SQL seperti berikut ini:

C:\>ttIsql LATIHAN

Command> CREATE USER solid IDENTIFIED EXTERNALLy;

User created.

Untuk login sebagai user solid, saya dapat memberikan atribut UID yang mewakili nama user dan PWD yang mewakili password, seperti berikut ini:

C:\>ttIsql -connStr "DSN=LATIHAN;UID=solid;PWD=snake"

Sama seperti di Oracle Database, user memiliki schema masing-masing.   User solid tidak dapat mengakses tabel milik user liquid dan sebaliknya.   Pengguna yang berlatar belakang MySQL mungkin dapat membayangkan bahwa sebuah user di TimesTen sebagai sebuah user plus sebuah database dengan nama yang sama bila di MySQL.

Setiap user dibatasi oleh privilege yang dimilikinya.   Privilege ADMIN adalah sebuah system privilege yang merupakan hak akses paling tinggi.   User yang memiliki privilege ini boleh melakukan apa saja!   Secara default, hanya instance administrator dan user internal dari TimesTen yang memiliki privilege ini.   Nantinya, instance administrator boleh memberikan hak ADMIN ke user lain bila dirasa perlu.

Untuk melihat privilege yang dimiliki oleh user, saya memberikan query SQL berikut ini:

C:\>ttIsql LATIHAN

Command> SELECT * FROM SYS.DBA_SYS_PRIVS;
< SYS, ADMIN, YES >
< SYSTEM, ADMIN, YES >
< SOLIDSNAKE, ADMIN, YES >
< SOLID, CREATE SESSION, NO >
4 rows found.

Terlihat bahwa user SOLIDSNAKE memiliki privilege ADMIN sementara user SOLID memiliki privilege CREATE SESSION.   Seorang user minimal harus memiliki privilege CREATE SESSION agar bisa melakukan koneksi ke database.

Instance administrator SOLIDSNAKE dapat memberikan hak akses ADMIN ke SOLID dengan memberikan perintah berikut ini:

Command> GRANT ADMIN TO SOLID;

Command> SELECT * FROM SYS.DBA_SYS_PRIVS;
< SYS, ADMIN, YES >
< SYSTEM, ADMIN, YES >
< SOLIDSNAKE, ADMIN, YES >
< SOLID, CREATE SESSION, NO >
< SOLID, ADMIN, YES >
5 rows found.

Untuk membuang privilege ADMIN milik user SOLID, saya dapat memberikan perintah berikut ini:

Command> REVOKE ADMIN FROM SOLID;

Command> SELECT * FROM SYS.DBA_SYS_PRIVS;
< SYS, ADMIN, YES >
< SYSTEM, ADMIN, YES >
< SOLIDSNAKE, ADMIN, YES >
< SOLID, CREATE SESSION, NO >
4 rows found.

Memakai Snort Di Windows 7

Pada tulisan Memakai Snort Sebagai IPS Di Notebook, saya mencoba menjalankan Snort di Ubuntu. Kali ini, saya akan mencoba menjalankan Snort di sistem operasi Windows 7.

PENTING: Pada Windows, Snort hanya bisa bekerja sebagai Intrusion Detection System (IDS) dan tidak bisa bekerja sebagai Intrusion Prevention System (IPS).

Di Windows juga terdapat paket lengkap yang disebut Windows Intrusion Detection System (WinIDS). Akan tetapi, WinIDS sepertinya dibuat untuk dipakai pada IDS sensor standalone sehingga dilengkapi berbagai paket termasuk laporan via web dan logging ke database MySQL. Karena hanya ingin menjalankan Snort pada komputer yang sama, saya men-download installer Snort 2.9.5 dari http://www.snort.org/downloads/2417. Saya akan men-install Snort pada lokasi root directory sehingga akan terdapat sebuah folder C:\snort. Saya juga perlu men-download dan men-install WinPcap dari http://www.winpcap.org/install/bin/WinPcap_4_1_3.exe.

Saya akan mencoba menjalankan Snort. Sebelumnya, saya perlu menjalankan Command Prompt dalam modus Administrator. Caranya adalah dengan mengetik cmd di Start menu Windows 7 kemudian menekan tombol Ctrl+Shift+Enter, atau memilih icon Command Prompt, men-klik kanan dan memilih menu “Run As Administrator“. Setelah itu, saya memberikan perintah berikut ini:

C:\snort\bin\snort -W

Parameter -W adalah parameter khusus untuk Windows yang akan menampilkan daftar perangkat yang dapat ditangani oleh Snort nantinya. Nama device sepertinya diperoleh dari fungsi getAdapterList() milik WinPcap. Function tersebut akan mengambil informasi perangkat jaringan dari registry HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}. Nama yang ada diawali dengan NPF yang merupakan singkatan dari Netgroup Packet Filter, sebuah bagian inti dari WinPcap.

Saya perlu mencatat nama perangkat yang perlu dipantau oleh Snort. Contoh nama perangkat misalnya \Device\NPF_{5D24AE04-C486-83FB-8B5EC6C7F430}. Karena nama perangkat sulit dikenali, saya menentukan perangkat berdasarkan description (seperti 3Com EtherLink PCI) atau alamat IP.

Catatan untuk pengguna dial-up PPP: WinPcap tidak mendukung koneksi PPP/VPN pada sistem operasi Windows Vista ke atas. Pada Windows 2000/XP 32-bit, capture dapat dilakukan pada adapter dengan deskripsi (‘Adapter for generic dialup and VPN capture’). Informasi ini diperoleh dari FAQ WinPcap di http://www.winpcap.org/misc/faq.htm#Q-5. Bila adapter ‘generic dialup‘ ini tidak muncul pada saat memberikan perintah snort -W, maka capture frame PPP tidak dapat dilakukan. Saya tidak menemukan keterbatasan ini pada sistem operasi Linux yang memakai library libpcap (WinPcap adalah port dari libpcap untuk Windows).

Langkah berikutnya adalah mencoba menjalankan Snort untuk menampilkan packet yang dicapture oleh WinPcap. Caranya adalah dengan memberikan perintah berikut ini:

C:\snort\bin\snort -dev -i namaperangkat

Karena nama perangkat sulit untuk diingat, saya juga dapat menggunakan nomor urut (berdasarkan nilai index di tampilan snort -W), seperti pada perintah berikut ini:

C:\snort\bin\snort -dev -i 3

Setelah ini, bila terdapat aktifitas jaringan pada perangkat tersebut, Snort akan menampilkan informasi ke layar. Pada modus ini, Snort bekerja sama seperti tcpdump atau Wireshark. Untuk keluar, saya menekan tombol Ctrl dan C secara bersamaan.

Untuk memakai Snort sebagai IDS (Intrusion Detection System), saya perlu melakukan konfigurasi pada file C:\snort\etc\snort.conf.

Perubahan yang saya lakukan adalah mengubah beberapa path Linux menjadi Windows, yaitu:

dynamicpreprocessor directory /usr/local/lib/snort_dynamicpreprocessor/
dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so

Menjadi:

dynamicpreprocessor directory C:\Snort\lib\snort_dynamicpreprocessor
dynamicengine C:\Snort\lib\snort_dynamicengine\sf_engine.dll

Selain itu, saya juga perlu menghapus baris ini:

#dynamicdetection directory /usr/local/lib/snort_dynamicrules

Agar saya tidak perlu menentukan device setiap kali menjalankan Snort, saya menambahkan baris berikut ini pada snort.conf:

config interface: namadevice <== misalnya \Device\NPF_{5D24AE04-C486-83FB-8B5EC6C7F430}

Saya juga perlu menyesuaikan network variables, seperti isi dari HOME_NET (ip dari komputer yang dilindungi), DNS_SERVERS, dsb. Selain itu, saya juga menyesuaikan lokasi variabel berikut ini sesuai dengan lokasi di Windows:

var RULE_PATH c:\snort\rules
var SO_RULE_PATH c:\snort\so_rules
var PREPROC_RULE_PATH c:\snort\preproc_rules
var WHITE_LIST_PATH c:\snort\rules
var BLACK_LIST_PATH c:\snort\rules
...
config logdir: C:\snort\log
Selain itu, saya juga perlu menghapus baris berikut ini:
preprocessor normalize_ip4
preprocessor normalize_tcp: ips ecn stream
preprocessor normalize_icmp4
preprocessor normalize_ip6
preprocessor normalize_icmp6

Fungsi normalisasi packet tidak berfungsi di Windows. Hal ini tidak akan berpengaruh bila Snort dijalankan dalam modus Intrusion Detection System (IDS) karena mereka hanya akan aktif bila Snort dipakai dalam modus Intrusion Prevention System (IPS).

Saya juga perlu menentukan output dari Snort (pesan bila terdapat hal mencurigakan). Paket yang lengkap WinIDS menampung output Snort ke dalam database dan memungkinkan hasilnya dibaca melalui web browser. Tapi saat ini yang saya butuhkan hanya menampilkan output ke layar command prompt, sehinggga saya menambahkan baris berikut ini pada file konfigurasi Snort:

output alert_fast: stdout

Untuk menjalankan Snort sebagai IDS, saya akan menggunakan perintah berikut ini:

C:\snort\bin\snort -c C:\snort\etc\snort.conf

Bila perintah tersebut diberikan saat ini, Snort akan protes dengan kesalahan seperti berikut ini:

ERROR: C:\snort\etc\c:\snort\rules/local.rules(0) Unable to open rules file "C:\snort\etc\c:\snort\rules/local.rules": Invalid argument.

Mengapa demikian? Isi dari folder rules saat ini masih kosong! Snort adalah IDS yang melakukan analisa packet (lalu lintas data di jaringan). Bila terdapat aktifitas jaringan yang mencurigakan, Snort akan melaporkannya. Snort mengetahui aktifitas packet mencurigakan atau tidak berdasarkan rules. Sourcefire selaku pembuat Snort juga menyediakan rules dan terus memperbaharuinya seiring dengan tren serangan. User yang membayar akan mendapatkan rules terbaru, sementara user yang mendaftar dapat memperoleh rules tersebut 30 hari kemudian secara gratis. Sebagai informasi, rules Snort tidak harus dibuat oleh Sourcefire Vulnerability Research Team (VRT), tetapi bisa saja dibuat oleh pakar keamanan komputer lainnya.

Saya segera mendownload rules dari http://www.snort.org/snort-rules. Setelah itu, saya men-extract isinya ke folder instalasi Snort; hasil extract akan memiliki nama folder yang mirip dengan di instalasi Snort. Saya perlu berhati-hati agar tidak menimpa file snort.conf, tetapi hanya menerapkan isi baris yang berbeda saja. Untuk melihat perbedaan file di Windows melalui perintah command line, saya dapat menggunakan perintah PowerShell berikut ini (untuk membuka PowerShell, ketik ‘Window PowerShell’ di menu Start):

PS C:\> Compare-Object $(Get-Content c:\snort\etc\snort.conf) $(Get-Content C:\download\rules\etc\snort.conf)
InputObject SideIndicator
----------- -------------
# VERSIONS : 2.9.4.1 =>
include $RULE_PATH/file-java.rules =>
include $RULE_PATH/indicator-scan.rules =>
include $RULE_PATH/os-mobile.rules =>
include $RULE_PATH/protocol-dns.rules =>
include $RULE_PATH/protocol-nntp.rules =>
include $RULE_PATH/protocol-rpc.rules =>
include $RULE_PATH/protocol-scada.rules =>
include $RULE_PATH/protocol-snmp.rules =>
include $RULE_PATH/protocol-telnet.rules =>
include $RULE_PATH/protocol-tftp.rules =>
include $RULE_PATH/server-samba.rules =>
# VERSIONS : 2.9.5.0 <=
...

Perintah Compare-Object di Windows PowerShell dipakai untuk membandingkan dua objek yang berbeda, termasuk isi file. Side indicator => menunjukkan bahwa baris tersebut ada di rules yang saya download tetapi belum ada di file konfigurasi Snort saya. Oleh sebab itu, saya perlu menambahkan baris include di atas pada file konfigurasi Snort.

Kali ini, bila saya menjalankan Snort, saya memperoleh pesan kesalahan yang berbeda, seperti berikut ini:

Unable to open address file C:\Snort\rules\white_list.rules, Error: No such file or directory

Reputation preprocessor membutuhkan dua file, white_list.rules dan black_list.rules. Saat ini kedua file tersebut tidak ada sehingga saya perlu membuatnya secara manual (file kosong). Reputation preprocessor tidak akan bekerja bila tidak menemukan isi pada kedua file tersebut.

Setelah ini, Snort dapat dijalankan dengan baik dengan memberikan perintah:

C:\snort\bin\snort -c C:\snort\etc\snort.conf

Sampai disini Snort dapat dijalankan dengan baik. Tapi saya perlu memastikan bahwa Snort bekerja sebagai IDS. Untuk itu, saya menambahkan baris berikut ini pada file konfigurasi:

alert icmp any any -> any any (msg: "Seseorang sedang men-ping!"; sid: 1000001;)

Baris di atas adalah sebuah rule yang akan memberikan alert setiap kali terdapat paket ICMP (tidak terbatas pada ping!) yang ditangkap. Saya kemudian mematikan Snort dan menjalankan kembali, kemudian saya mencoba men-ping dari komputer lain. Berikut adalah hasil yang saya peroleh:

--== Initialization Complete ==--

,,_ -*> Snort! <*-
o" )~ Version 2.9.5-WIN32 GRE (Build 103)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/snort/snort-t
eam
Copyright (C) 1998-2013 Sourcefire, Inc., et al.
Using PCRE version: 8.10 2010-06-25
Using ZLIB version: 1.2.3

Rules Engine: SF_SNORT_DETECTION_ENGINE Version 2.0 <Build 1>
Preprocessor Object: SF_SSLPP Version 1.1 <Build 4>
Preprocessor Object: SF_SSH Version 1.1 <Build 3>
Preprocessor Object: SF_SMTP Version 1.1 <Build 9>
Preprocessor Object: SF_SIP Version 1.1 <Build 1>
Preprocessor Object: SF_SDF Version 1.1 <Build 1>
Preprocessor Object: SF_REPUTATION Version 1.1 <Build 1>
Preprocessor Object: SF_POP Version 1.0 <Build 1>
Preprocessor Object: SF_MODBUS Version 1.1 <Build 1>
Preprocessor Object: SF_IMAP Version 1.0 <Build 1>
Preprocessor Object: SF_GTP Version 1.1 <Build 1>
Preprocessor Object: SF_FTPTELNET Version 1.2 <Build 13>
Preprocessor Object: SF_DNS Version 1.1 <Build 4>
Preprocessor Object: SF_DNP3 Version 1.1 <Build 1>
Preprocessor Object: SF_DCERPC2 Version 1.0 <Build 3>
Commencing packet processing (pid=xxxx)
07/20-12:13:08.176640 [**] [1:1000001:0] Seseorang sedang men-ping! [**] [Prior
ity: 0] {ICMP} xxx.xxx.xxx.xxx -> xxx.xxx.xxx.xxx
07/20-12:13:09.177903 [**] [1:1000001:0] Seseorang sedang men-ping! [**] [Prior
ity: 0] {ICMP} xxx.xxx.xxx.xxx -> xxx.xxx.xxx.xxx

Bila perlu, saya juga dapat mengaktifkan pendeteksian port scan, dengan menambahkan baris berikut ini pada file konfigurasi:

preprocessor sfportscan: proto { all } sense_level { medium } logfile { portscan.log }

Hasil alert bila terjadi port scan tidak akan ditampilkan ke layar, melainkan akan disimpan ke file C:\snort\log\portscan.log. Untuk mengujinya, saya dapat menggunakan nmap dari komputer lain.

Perlu diingat bahwa saat ini Snort bekerja dalam modus Intrusion Detection System (IDS). Detection disini benar2 hanya berarti mendeteksi dan memberitahu bila terjadi serangan! Tidak ada upaya untuk menanggulangi atau menghindari serangan. Hal ini berguna bila Snort dipakai dalam honeypot, sebuah sistem yang sengaja menarik perhatian hacker guna menganalisa teknik serangan mereka. IDS seperti Snort biasanya berada di lapisan sebelum firewall sehingga packet dapat dianalisa secara lengkap sebelum diteruskan ke firewall.

Pada Windows, Snort tidak dapat bekerja pada inline mode atau Intrusion Prevention System (IPS). Sebagai contoh, walaupun aktifitas port scan tercatat dan diketahui oleh pengguna, hasil port scan tetap diperoleh oleh penyerang! Selain itu, saya tidak menemukan cara untuk menkonfigurasi firewall bawaan Windows 7 untuk membiarkan Snort bekerja terlebih dahulu sebelum penyaringan dilakukan. Semua pengujian di atas saya lakukan dengan mematikan firewall bawaan. Hal ini tentunya tidak aman untuk keperluan sehari-hari.