Shell dropper and API
parent
37e353bbc6
commit
4e92b628c7
@ -0,0 +1,127 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import paramiko, socket, sys, termios, tty, select, urllib, urllib2, json
|
||||
|
||||
key = "abcde"
|
||||
endpoint = "http://cvm.local/api.local.php"
|
||||
|
||||
def posix_shell(chan, ctid):
|
||||
oldtty = termios.tcgetattr(sys.stdin)
|
||||
|
||||
try:
|
||||
tty.setraw(sys.stdin.fileno())
|
||||
tty.setcbreak(sys.stdin.fileno())
|
||||
chan.settimeout(0.0)
|
||||
|
||||
chan.send('%s\r\nclear\r\n' % ctid)
|
||||
|
||||
while True:
|
||||
r, w, e = select.select([chan, sys.stdin], [], [])
|
||||
if chan in r:
|
||||
try:
|
||||
buff = chan.recv(1024)
|
||||
if len(buff) == 0:
|
||||
print '\r\nYou have been logged out of your container. Goodbye!\r\n',
|
||||
break
|
||||
sys.stdout.write(buff)
|
||||
sys.stdout.flush()
|
||||
except socket.timeout:
|
||||
pass
|
||||
if sys.stdin in r:
|
||||
buff = sys.stdin.read(1)
|
||||
if len(buff) == 0:
|
||||
break
|
||||
chan.send(buff)
|
||||
|
||||
finally:
|
||||
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
|
||||
|
||||
def open_shell(hostname, user, container):
|
||||
ssh = paramiko.SSHClient()
|
||||
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
|
||||
sshkey = paramiko.RSAKey.from_private_key_file('/etc/cvm/key')
|
||||
|
||||
ssh.connect(hostname, username=user, pkey=sshkey)
|
||||
|
||||
chan = ssh.invoke_shell()
|
||||
posix_shell(chan, container)
|
||||
|
||||
chan.close()
|
||||
ssh.close()
|
||||
|
||||
def api_request(parameters, method="GET"):
|
||||
if method == "GET":
|
||||
querystring = urllib.urlencode(parameters)
|
||||
req = urllib2.Request(endpoint + "?" + querystring)
|
||||
response = urllib2.urlopen(req)
|
||||
return json.loads(response.read())
|
||||
|
||||
|
||||
print "#############################################################"
|
||||
print "### CVM OpenVZ shell dropper ###"
|
||||
print "#############################################################"
|
||||
print ""
|
||||
print "Please enter your VPS panel login details to continue."
|
||||
print ""
|
||||
username = raw_input("Username: ")
|
||||
password = raw_input("Password: ")
|
||||
print ""
|
||||
|
||||
auth_result = api_request({
|
||||
'key': key,
|
||||
'action': "verify_user",
|
||||
'username': username,
|
||||
'password': password
|
||||
})
|
||||
|
||||
if auth_result['data']['correct'] == True:
|
||||
vpslist = api_request({
|
||||
'key': key,
|
||||
'action': "list_vps",
|
||||
'userid': auth_result["data"]["userid"]
|
||||
})
|
||||
|
||||
print "Select the container you wish to log in to."
|
||||
print ""
|
||||
|
||||
i = 1
|
||||
vpsmap = {}
|
||||
nodelist = []
|
||||
nodemap = {}
|
||||
|
||||
for vps in vpslist["data"]:
|
||||
vpsmap[i] = vps
|
||||
|
||||
if vps["NodeId"] not in nodelist:
|
||||
nodelist.append(vps["NodeId"])
|
||||
|
||||
i += 1
|
||||
|
||||
for node in nodelist:
|
||||
nodemap[node] = api_request({
|
||||
'key': key,
|
||||
'action': "node_info",
|
||||
'nodeid': node
|
||||
})['data']
|
||||
|
||||
for key, vps in vpsmap.items():
|
||||
node = nodemap[vps['NodeId']]
|
||||
print "%s. %s (%s [%s], %s)" % (key, vps['Hostname'], node['Name'], node['Hostname'], node['PhysicalLocation'])
|
||||
|
||||
print ""
|
||||
choice = raw_input("Make your choice: ")
|
||||
|
||||
try:
|
||||
current_vps = vpsmap[int(choice)]
|
||||
current_node = nodemap[current_vps['NodeId']]
|
||||
|
||||
open_shell(current_node['Hostname'], "vz", current_vps['InternalId'])
|
||||
except KeyError, ValueError:
|
||||
print "That was not a valid option."
|
||||
|
||||
exit(0)
|
||||
else:
|
||||
print "The supplied login details are invalid."
|
||||
print "Your session will now be closed."
|
||||
exit(1)
|
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/python
|
||||
import sys, subprocess
|
||||
|
||||
ctid = raw_input()
|
||||
subprocess.call(['sudo', 'vzctl', 'enter', ctid])
|
Loading…
Reference in New Issue