滴水之恩,当涌泉相报---对母校的一次渗透测试

起因:

时间过得真快,转眼就要大学毕业了,学了这么久的安全,还没有对母校测试一下,哈哈哈,去年测试过,那时候刚学,啥也不会,就感觉学校网站很安全,今天再次测试发现,ennnnnn,"挺好的"。

开始测试

首先进入官网,在官网里面有很多网站服务。

webvpn逻辑?弱口令?

image.png


在这个页面中可以看到给了用户名的密码,那么用户名是什么呢?哪里获取用户名?
接下来就继续进入寻找其它网站了,寻找一些信息泄露什么的,或者用户名枚举什么的,发现的一个用户名枚举的网站。

image.png


点击修改密码,填写内容并提交

image.png


更换一个测试账号尝试:

image.png

如果账号存在则返回密码错误,若不存在则返回不存在。
尝试爆破账号,对后三位进行爆破

image.png

测试后,找到近百的账号,将账号放到刚刚的webvpn中测试,密码就用网页显示的。

image.png

然后就很舒服了,拥有了几十个vpn账号,然后满心欢喜的登录进去,发现.....

image.png

呵呵呵

image.png

为了回报母校,怎么能就挖一个弱口令给学校呢。这不是很尴尬了。

thinkphp rce

继续找网站,在主站的下面看到了一个教学诊断网

image.png


这个确实.....很nice,直接拿出thinkphp漏扫,直接输入url,测试

image.png

image.png

某系统漏洞合集

当拿到第一个shell后就蛮开心的,继续寻找下一个站点测试,一个一年才打开一次的网站。厚码厚码(我很爱我的学校)

image.png

image.png


ennn,其实翻到这个页面的时候,没有抱着可以挖到漏洞的心态的,主要是因为.....

image.png

进入公共课页面,查看一下有没有waf,尝试插入一条xss的payload,然后.....

image.png


额....这是什么waf呀,不认识,那么接下来存在waf的情况下,很多操作都无法进行了,那么在这种情况下,我一般会将这个网址的真实ip找出来,判断是否是云waf,同时找到真实ip也会增加收集到更多的信息。

image.png

找到真实ip后就端口扫描了,在端口扫描之前最好先在鹰图,fofa等等平台先收集一波信息,因为nmap或是masscan扫描时可能会封ip。

经过扫描发现了该平台在8099端口,然后就是判断是否会拦截payload了。

image.png

image.png

good,很好,那么接下来就是测试漏洞了。

看到这个登录界面,首先就是测试是否弱口令,sql注入或者逻辑了,但是经过测试发现不存在这些漏洞,但是存在一个用户枚举漏洞。

用户枚举

image.png

然后就是fuzz测试账号了,但是这个漏洞很鸡肋,这里就提一嘴,没啥用。

接口未授权

在尝是了一波js接口后没有发现什么漏洞,但是查找到了一些(没有用的)信息泄露。
近万条数据吧

image.png

这样的接口存在3个,但是没有一些很敏感的东西。
以及一句mssql的报错语句

image.png

但是像这样的信息泄露算漏洞吗?

image.png

本来打算放弃的,但是想起来github,于是将学校域名放github上搜了一些,峰回路转,惊喜来了。

image.png

之前都没有找到这个子域名,于是惊喜的将这个打开,

image.png

看到这个我感觉差不多赢了一半了,于是开始测试接口,发现接口认证的参数
&accessKey={accessKey}&secretKey={secretKey}
没有作用,无论填不填这两个参数都可以查询或是操作这些接口,相当于这些接口全部都可以调用。

image.png


差不多有十几个接口吧。可以添加用户,删除用户,查看学分,查看用户详情等等。
okok,注册一个用户,开始下一轮漏洞。

image.png

image.png

sql注入(两枚)

在刚刚注册了用户,登录进去。

image.png

到这里之后正常的思路应该是找上传点,然后getshell,但是还是想测一下js文件,说不定有什么意外收获呢,于是在经过半小时的测试后发现了几处未授权接口。

第一处

image.png

将url和参数进行拼接。

image.png

当时测试的时候在id的后面增加字母或者纯数字或是其他标点符号都没有问题(' 123a 等等字符),但是测试发现增加单引号后网页发生了跳转?
于是将该url放入了sqlmap尝试注入:

image.png


查看是否为dba权限。

image.png

image.png

开摆了。

第二处

第二处同样是js文件内找到。

image.png

继续构造参数

image.png

然后就是fuzz测试了,发现stucode参数在加入单引号后就会返回False,而加入其他任何字符都是返回True,

image.png

哎,大概率存在盲注。

image.png


经过漫长的等待,终于测试出来了,盲注.....

image.png

image.png

文件上传

在头像上传的地方,上传图片,抓包。

image.png

更改后缀,发现上传文件没有过滤,但是上传脚本文件直接500错误,这个网站是由iis搭建的。

image.png

而上传php文件则直接404,应该是服务器设置了什么规则,哎。尝试过很多,但是都失败了。并且会对文件内容进行校验。

image.png


但是但是,xss我们还是可以试试的,哎,rce没办法,那就弹个窗吧。

image.png

在图片中间的地方插入xss语句

image.png

image.png

但是如果没有找到可以注册的api,则这个漏洞无法利用,为了扩大漏洞危害,尝试删除cookie,是否可以未授权文件上传。

image.png

额,ok,存储型xss.......

image.png

弱口令+被拦截的文件上传

继续测试,找到一个心理健康中心的平台,直接找到后台地址

image.png

尝试登录,查看数据包

image.png

image.png

这个难道存在admin用户?可以尝试爆破其他用户?并且测试发现,验证码可以重复使用,

image.png

于是直接先来一个爆破用户名

image.png

额,有点小意外,哈哈哈哈。

image.png

这是啥操作?我只是想爆破用户名的......

登录进入后台

image.png


找到文件上传的地方,这里其实测试过js文件内的接口,发现都需要认证,没办法只能找上传接口了。

image.png

经过我不断的测试发现,这个文件上传不存在后缀名过滤,

image.png


但是存在waf,至于是什么waf就无法判断了,尝试了很多方法都无法绕过,

image.png

但是但是,作为一个有理想的人,好歹也来个弹窗吧,安慰一下自己。

上传一个xml文件,弹窗

image.png

少壮不努力,老大玩弹窗

image.png

为了扩大漏洞危害,必须是未授权上传呀,不然这算漏洞吗?

直接把认证和cookie都删除了

image.png

未授权文件上传(存储xss)......

无意中看到这个页面......

image.png

你以为我会继续测试?

image.png


我没有身份证,所以不测了。

信息收集+登录后台+没有绕过的文件上传

这次是一个第二课堂的系统,其实刚进来是完全没有头绪的.....直到

image.png


于是,我将之前信息泄露的学生学号放上去测试,然后

image.png

image.png

难道学校欺骗小学生?
我不甘心,然后将前面爆破到的教工账号放上去测试。

image.png

image.png

进入后找了一堆接口发现全部要登录,而且没啥漏洞,于是就把手伸到了文件上传的地方。
第一处:

image.png

这一处应该存在黑名单过滤,脚本类文件无法上传,这里包括了xml,html,js,css文件均无法上传,该系统应该存在waf,上传脚本文件直接400错误,就连弹窗快乐一下都不行了?

image.png

放弃是不可能的,记得pdf应该也可以弹窗的,然后就是找pdf的弹窗payload,

工具:
osnr/horrifying-pdf-experiments: Stuff which works in Chrome and maybe Acrobat and Foxit. (github.com)

scq.py

# FROM https://github.com/osnr/horrifying-pdf-experiments
import sys

from pdfrw import PdfWriter
from pdfrw.objects.pdfname import PdfName
from pdfrw.objects.pdfstring import PdfString
from pdfrw.objects.pdfdict import PdfDict
from pdfrw.objects.pdfarray import PdfArray

def make_js_action(js):
    action = PdfDict()
    action.S = PdfName.JavaScript
    action.JS = js
    return action

def make_field(name, x, y, width, height, r, g, b, value=""):
    annot = PdfDict()
    annot.Type = PdfName.Annot
    annot.Subtype = PdfName.Widget
    annot.FT = PdfName.Tx
    annot.Ff = 2
    annot.Rect = PdfArray([x, y, x + width, y + height])
    annot.MaxLen = 160
    annot.T = PdfString.encode(name)
    annot.V = PdfString.encode(value)

    # Default appearance stream: can be arbitrary PDF XObject or
    # something. Very general.
    annot.AP = PdfDict()

    ap = annot.AP.N = PdfDict()
    ap.Type = PdfName.XObject
    ap.Subtype = PdfName.Form
    ap.FormType = 1
    ap.BBox = PdfArray([0, 0, width, height])
    ap.Matrix = PdfArray([1.0, 0.0, 0.0, 1.0, 0.0, 0.0])
    ap.stream = """
%f %f %f rg
0.0 0.0 %f %f re f
""" % (r, g, b, width, height)

    # It took me a while to figure this out. See PDF spec:
    # https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf#page=641

    # Basically, the appearance stream we just specified doesn't
    # follow the field rect if it gets changed in JS (at least not in
    # Chrome).

    # But this simple MK field here, with border/color
    # characteristics, _does_ follow those movements and resizes, so
    # we can get moving colored rectangles this way.
    annot.MK = PdfDict()
    annot.MK.BG = PdfArray([r, g, b])

    return annot

def make_page(fields, script):
    page = PdfDict()
    page.Type = PdfName.Page

    page.Resources = PdfDict()
    page.Resources.Font = PdfDict()
    page.Resources.Font.F1 = PdfDict()
    page.Resources.Font.F1.Type = PdfName.Font
    page.Resources.Font.F1.Subtype = PdfName.Type1
    page.Resources.Font.F1.BaseFont = PdfName.Helvetica

    page.MediaBox = PdfArray([0, 0, 612, 792])

    page.Contents = PdfDict()
    page.Contents.stream = """
BT
/F1 24 Tf
ET
    """

    annots = fields

    page.AA = PdfDict()
    # You probably should just wrap each JS action with a try/catch,
    # because Chrome does no error reporting or even logging otherwise;
    # you just get a silent failure.
    page.AA.O = make_js_action("""
try {
  %s
} catch (e) {
  app.alert(e.message);
}
    """ % (script))

    page.Annots = PdfArray(annots)
    return page

if len(sys.argv) > 1:
    js_file = open(sys.argv[1], 'r')

    fields = []
    for line in js_file:
        if not line.startswith('/// '): break
        pieces = line.split()
        params = [pieces[1]] + [float(token) for token in pieces[2:]]
        fields.append(make_field(*params))

    js_file.seek(0)

    out = PdfWriter()
    out.addpage(make_page(fields, js_file.read()))
    out.write('result.pdf')

payload.js

app.alert("xss")

运行:

python scq.py payload.js

然后会多出来应该result.pdf的文件。

然后怀着激动的心情上传

image.png

image.png

接下里就是跟上面的一样了,将认证信息以及cookie全部删除,看文件是否可以正常上传

image.png


发现文件一样可以上传,可以造成存储xss,哎。

image.png

弱口令?

进入另外一处登录地址,是志愿服务

image.png


这里尝试了学号,发现学号是无法登录的,然后又用到了教职工号,然后一发入魂

image.png

发现所以职工号的密码都为123456,但是进入后需要点击注册,可以接管这个账号,但是作为一个有原则的人,没有进行注册填写,没有影响原有数据。

image.png

结尾

额...还有几处漏洞,都是一些框架的漏洞,没什么可说的,直接工具梭哈就可以了,比如struts。
上面说的漏洞也就一个可以getshell,但是这一个getshell并不影响我们进入内网。

image.png

直接tasklist查看一下进程

image.png


火绒?

image.png


懂得都懂好吧,火绒的横向渗透拦截较强,其他的.....

后续就是上线cs,内网漫游了。

简单说一下内网吧,fscan梭哈,资产还是很多的,一些老框架的漏洞很多,还有弱口令有一些吧,大部分都是数据库弱口令。防护软件部分电脑存在。

内网里面的渗透就暂且不发了。

总体来说,这次渗透最重要的就是信息收集了,以及各种漏洞的组合,同时自己也对那些waf的拦截机制也不是很了解,导致后面的几个黑名单都没有绕过去,未来还是需要好好研究一下文件上传过waf的思路了,不然直接高危变低危。少壮不努力,老大玩弹窗。

文章来源:https://forum.butian.net/share/2038

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值