Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- #: Filename : rexecutor.rb
- #: Title : rExecutor
- #: Author : "Iarmin" <[email protected]>
- #: Version : 0.1
- #: Description : A little webserver, that accepts JSON input via GET method. Supports authentication code and executes the given command.
- #: Gems : json SystemTimer
- #: Installer :
- #
- require 'socket'
- require 'cgi'
- require 'rubygems'
- require 'json'
- require 'open3'
- require 'system_timer'
- $AUTHCODE = "<CODE>" # the authentication code
- $LISTEN_IP = "0.0.0.0" # Bound IP
- $LISTEN_PORT = 9091 # Port to listen
- $ALLOWED_CMDS = [ "df", "uname" ] # allowed commands
- class HttpServer
- def initialize(session, request)
- @session = session
- @request = request
- end
- def serve()
- begin
- request = @request.chomp
- raise if ! request.start_with?("GET /")
- request.gsub!(/^GET \//,"").gsub!(/ .*/,"")
- request = CGI::unescape( request )
- request = JSON.parse( request.chomp )
- response = '[]'
- begin
- SystemTimer.timeout_after( 6 ) do
- response = process( request )
- end
- rescue Timer::Timeout
- response = { :error => "Timeout" }
- rescue Exception => e
- response = { :error => e.to_s }
- end
- response = response.to_json
- contentType = "text/plain"
- @session.print "HTTP/1.1 200/OK\r\nServer: Remote Executor\r\nContent-type: text/plain\r\n\r\n"
- @session.print( "#{response}\n" )
- rescue
- @session.print "HTTP/1.1 400/ERROR\r\nInvalid request\r\n\r\n"
- ensure
- @session.close
- end
- end
- def process( request )
- response = {}
- begin
- raise "Invalid auth code" if request["auth"] != $AUTHCODE
- _exec = request["exec"]
- unallowed = true
- $ALLOWED_CMDS.each do |cmd|
- unallowed = false if _exec == cmd
- end
- raise "Restricted command" if unallowed
- stdin, stdout, stderr, wait_thr = Open3.popen3( _exec )
- response = { :stdout => stdout.read, :stderr => stderr.read }
- rescue Exception => e
- response = { :error => s.to_s }
- end
- end
- end
- server = TCPServer.new($LISTEN_IP, $LISTEN_PORT)
- loop do
- session = server.accept
- request = session.gets
- Thread.start(session, request) do |session, request|
- HttpServer.new(session, request).serve()
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement