当前位置: 首页 > 后端技术 > Python

【保姆级Python教学】万物皆可用API

时间:2023-03-26 13:56:47 Python

今天看到一个开源项目Command2API,很有意思,分享给大家。起源关于为什么会诞生这个项目,原来的Repo有这么一段话:“以最近的Log4jRCE为例,在内网的安全测试中,由于网络环境限制,没有可用的DNSLog平台。此时,在做Log4j漏洞验证的时候,考虑直接查看是否连接了LDAP服务,但是现成的JNDI注入工具没有API直接拉取对应服务的结果,需要人工查看,这是时间-耗,已经写了BurpSuite被动插件扫描,为了节省时间,我干脆写了这个脚本获取JNDI工具的执行结果,并以API的形式返回,方便插件提取漏洞验证结果。”反正大体的思路是,如果一些命令的执行结果可以通过HTTPAPI暴露出来,我们就可以更方便的获取命令的执行结果,在某些场景下是非常方便的。所以,这里作者写了这个项目。原理这个原理其实很简单,就是用一个Python线程启动Web服务,一个线程执行命令,通过全局变量把命令执行的结果共享给Web服务。RunHere,我们运行一下看看效果。首先,你需要下载如下项目:gitclonehttps://github.com/gh0stkey/Command2API.git然后指定你要运行的命令和API运行的端口。示例如下:pythonCommand2Api.py"executedcommand"Web运行的端口"注意这里的python用的是Python2,不是Python3,因为原项目引用了一个叫BaseHTTPServer的包,Python3没有。"这里我们执行一个ping命令试试:pythonCommand2Api.py"pingwww.baidu.com"8888运行结果如下:可以看到,这里首先输出了一个运行地址:URL:http://HOST:8888/c1IvlLF9现在我们打开http://localhost:8888/c1IvlLF9看看。可以看到控制台结果显示在网页上。“但是这个页面不能自动刷新,需要点击刷新才能得到最新的结果。”介绍完了。因此,这个项目在某些情况下非常有用。例如:在内网安全测试中,可以用来获取JNDI工具的执行结果,并以API的形式返回,便于观察执行结果。我们想要实时监控或者获取一个命令行程序的输出,比如Scrapy爬虫,比如WebServer等等,都是可以暴露的。如果我们想快速分享某个程序的执行结果,可以使用这个命令配合Ngrok生成一个网站进行分享。ETC。源码分析我们再来看一下源码。其实很简单。总共只有这些代码:importsubprocessimportBaseHTTPServerimportSimpleHTTPServerimportcgiimportthreadingimportsysimportstringimportrandoml=[]uri='/'+''.join(random.sample(string.ascii_letters+string.digits,8))classthread(threading.Thread):def__init__(self,threadname,command):threading.Thread.__init__(self,name='Thread_'+threadname)self.threadname=int(threadname)self.command=commanddefrun(self):globallret=subprocess.Popen(self.command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,initerstderrt=subprocess.PIPEstdout.readline,b""):res=i.decode().strip()print(res)l.append(res)classServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):defdo_GET(self):globallifself.path==uri:self.send_response(200)self.send_header('Content-Type','text/plain')self.end_headers()self.wfile.write(l)if__name__=='__main__':#新线程:获取命令结果t1=thread('1',sys.argv[1])t1.start()#Webserverport=int(sys.argv[2])print("URL:http://HOST:{0}{1}".format(port,uri))Handler=ServerHandlerhttpd=BaseHTTPServer.HTTPServer(('0.0.0.0',port),Handler)httpd.serve_forever()可以看到这个命令是Popen执行的,然后通过PIPE捕获结果赋值给一个变量,然后用另一个线程同时启动服务器,将结果写入Response。方便的功能。优化但是我觉得这个项目还有很大的优化空间。简要总结:现在支持Python2而不是Python3。Web结果无法自动刷新。网页结果是一个列表,与控制台结果的格式不同。该工具包无法通过pip进行保护。可以对输出结果的HOST进行优化,直接复制后不易访问。可以配合ngrok公开结果。如果能通过网页交互控制命令就更好了。我看看有没有时间,我可以尝试重写这个项目,实现上面的一些优化功能。时间到了,我就发出去。感谢阅读~