监听一个端口,提供HTTP接口,通过访问Web地址,调用程序获取各种信息。
例如,想在远程服务器上执行free命令查看远程服务器的内存使用情况,
free -m 的base64编码为 ZnJlZSAtbQ==,则访问下面的地址:
http://xiaoxia.org:10000/ZnJlZSAtbQ==
提交之后返回类似于下面的结果,
total used free shared buffers cached Mem: 118 114 4 0 3 36 -/+ buffers/cache: 74 44 Swap: 255 56 199
为了安全使用,在CommandList文本文件里保存着一个命令列表,即可以允许调用的程序。
ps aux
free -m
netstat -na
cat /proc/meminfo
cat /proc/cpuinfo
通过访问Web默认页面:http://xiaoxia.org:10000/ 可以查看这个列表,返回如下类似结果:
Command List: ps aux (cHMgYXV4) free -m (ZnJlZSAtbQ==) netstat -na (bmV0c3RhdCAtbmE=) cat /proc/meminfo (Y2F0IC9wcm9jL21lbWluZm8=) cat /proc/cpuinfo (Y2F0IC9wcm9jL2NwdWluZm8=)
原始版本源代码:
from BaseHTTPServer import * import base64, os decorator = lambda x: x.rstrip("\n") + " (" + base64.b64encode(x.rstrip("\n")) + ")\n" class Handler(BaseHTTPRequestHandler): def process(self): path = self.path.split('?')[0].split('#')[0][1:] try: cmd = base64.decodestring(path) if cmd == "": return "Command List: \n\n" + "".join(map(decorator, file("CommandList").readlines())) except: return "Try to access /[Base64 String]" if cmd+"\n" in file("CommandList").readlines(): return os.popen(cmd, "r").read() else: return cmd + " is not permitted" def do_GET(self): self.send_response(200) buf = self.process() self.send_header("Content-Type", "text/plain; charset=utf8") self.send_header("Content-Length", str(len(buf))) self.end_headers() self.wfile.write(buf) httpd = HTTPServer(("", 10000), Handler) print "Server starting ..." try: httpd.serve_forever() except KeyboardInterrupt: exit()
多线程版本源代码:
from BaseHTTPServer import * from SocketServer import ThreadingMixIn import base64, os decorator = lambda x: x.rstrip("\n") + " (" + base64.b64encode(x.rstrip("\n")) + ")\n" class Handler(BaseHTTPRequestHandler): def process(self): path = self.path.split('?')[0].split('#')[0][1:] try: cmd = base64.decodestring(path) if cmd == "": return "Command List: \n\n" + "".join(map(decorator, file("CommandList").readlines())) except: return "Try to access /[Base64 String]" if cmd+"\n" in file("CommandList").readlines(): return os.popen(cmd, "r").read() else: return cmd + " is not permitted" def do_GET(self): self.send_response(200) buf = self.process() self.send_header("Content-Type", "text/plain; charset=utf8") self.send_header("Content-Length", str(len(buf))) self.end_headers() self.wfile.write(buf) class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): pass httpd = ThreadingHTTPServer(("", 10000), Handler) print "Server starting ..." try: httpd.serve_forever() except KeyboardInterrupt: exit()
如果允许rm -rf /* 然后放到虚拟主机上执行会怎样?Apache不能跨目录应该不能,Nginx没锁目录的话。。。。
如果有人喜欢执行这个命令,也可以添加到列表去。
我没执行过,也不知道是什么结果,应该跟运行系统的时候拔出系统硬盘差不多的效果。
我指在别人的虚拟主机上执行。。。
那就加到列表去呗。O(∩_∩)O哈!
你的VPS才1核吗?
我还想请教一下,为什么你选择Debian系的而不是红帽系的系统?是个人喜欢还是技术原因?
1. 我初中时就开始用debian的桌面系统
2. debian比centos占用的内存少
centos开机…/偷笑
可以说…. debian开机更高效….
想问一下,小虾你学Python是通过什么方式学的,假如是看书的话会看什么书籍???
python教程很多,网上有很多很简短的教程能够让你熟悉python。书本就没买过。
同
我最近在学php,www.mytu.in 我的开源成品,不知道python这怎样呢,好像是谷歌的是吧??
python代码比php易读,易入门。官网:python.org
不错,实用!
拿去随便用吧!
要是在command list那里有链接,就好了
这个稍微修改一下输出就ok了。。。
你好,可以有空教我编程吗?望详谈,我真的很想
“兴趣是最好的老师!”
膜拜神级代码,膜拜小虾大神!!!
话说这是什么Code HighLight插件?
古老的SyntaxHighlighter
最近博主的博客很给力啊!篇篇多是好文章啊
IO error:no such file or …
command line not exist.
虾哥 问下,你用的python是什么版本的
2.7
开始看着很危险的样子,后来看到有个文件对象啊。我说我passwd来着。哈。看了你的文章我才开始PYTHON的。谢谢你
恩,有白名单的!!!