WinRM shell (a.k.a. PowerShell Remoting) with file upload capability

WinRM κέλυφος (PowerShell Remoting) με δυνατότητα ανεβάσματος αρχείων

· Coding Προγραμματισμός Cybersecurity Κυβερνοασφάλεια · ruby ruby tool εργαλείο winrm winrm shell κέλυφος powershell powershell upload ανέβασμα

According to Microsoft, PowerShell Remoting is the recommended way to manage Windows systems. PowerShell Remoting uses Windows Remote Management (WinRM), which is the Microsoft implementation of the Web Services for Management (WS-Management) protocol, to allow users to run PowerShell commands on remote computers. But can we make use of it (i.e. connect) from a Linux machine?

Σύμφωνα με την Microsoft, το PowerShell Remoting είναι ο ενδεδειγμένος τρόπος για την απομακρυσμένη διαχείριση Windows συστημάτων. Το PowerShell Remoting χρησιμοποιεί το Windows Remote Management (WinRM), το οπόιο αποτελεί την υλοποίηση της Microsoft για το πρωτόκολλο Web Services for Management (WS-Management), που επιτρέπει στους χρήστες να εκτελούν εντολές PowerShell σε απομακρυσμένους υπολογιστές. Αλλά μπορούμε να κάνουμε χρήση του (δηλαδή να συνδεθούμε) από ένα Linux μηχάνημα;

For the time being, PowerShell on Linux is not mature and cannot communicate correctly with a Windows Machine using WinRM. Same goes for the Python modules I tested. The only thing that seems to work correctly on Linux is some Ruby modules (winrm and winrm-fs). So, I wrote the following Ruby script which also features a file upload capability.

Για την ώρα, το PowerShell στο Λίνουξ δεν είναι ώριμο και δεν είναι σε θέση να επικοινωνήσει σωστά με ένα Windows μηχάνημα μέσω του WinRM. Το ίδιο ισχύει και για κάποιες βιβλιοθήκες της Python που δοκίμασα. Το μόνο πράγμα που φαίνεται να δουλεύει σωστά στο Λίνουξ είναι κάποιες βιβλιοθήκες της Ruby (winrm και winrm-fs). Έτσι, έγραψα το παρακάτω πρόγραμμα Ruby που διαθέτει επίσης και δυνατότητα ανεβάσματος αρχείων.

require 'winrm-fs'

# Author: Alamot
# To upload a file type: UPLOAD local_path remote_path
# e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt


conn = WinRM::Connection.new( 
  endpoint: 'https://IP:PORT/wsman',
  transport: :ssl,
  user: 'username',
  password: 'password',
  :no_ssl_peer_verification => true
)


class String
  def tokenize
    self.
      split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/).
      select {|s| not s.empty? }.
      map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')}
  end
end


command=""
file_manager = WinRM::FS::FileManager.new(conn)


conn.shell(:powershell) do |shell|
    until command == "exit\n" do
        output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')")
        print(output.output.chomp)
        command = gets
        if command.start_with?('UPLOAD') then
            upload_command = command.tokenize
            print("Uploading " + upload_command[1] + " to " + upload_command[2])
            file_manager.upload(upload_command[1], upload_command[2]) do |bytes_copied, total_bytes, local_path, remote_path|
                puts("#{bytes_copied} bytes of #{total_bytes} bytes copied")
            end
            command = "echo `nOK`n"
        end
        output = shell.run(command) do |stdout, stderr|
            STDOUT.print(stdout)
            STDERR.print(stderr)
        end
    end    
    puts("Exiting with code #{output.exitcode}")
end

You can download this tool from here: winrm_shell_with_upload.rb

Μπορείτε να κατεβάσετε αυτό το εργαλείο απο εδώ: winrm_shell_with_upload.rb

See also...

Δείτε επίσης...