1

chap0x08+chap0x09 实战Snort/Suricata检测SQL注入和Shellshock漏洞攻击并联动iptables进行防御(阻断来源IP访问1分钟并记录日志)

  • 实验环境
    Victim: ip 192.168.29.123 Snort/Suricata + Guardian-1.7.tar.gz + apache2

     `Attacker :   ip 192.168.29.122`
    
  • 实验背景

    • 首先按照第九章实验方法安装了Snort 和 Guardian-1.7.tar.gz两个工具。

      export DEBIAN_FRONTEND=noninteractive# 禁止在apt安装时弹出交互式配置界面
      apt install snort
       
      wget https://sec.cuc.edu.cn/huangwei/textbook/ns/chap0x09/attach/guardian.tar.gz #下载脚本
      tar zxf guardian.tar.gz  #解压缩
      apt install libperl4-corelibs-perl #安装依赖lib
      编辑 guardian.conf 并保存(修改HostIpAddr为192.168.29.123 和Interface 为eth1
      
    • 安装apache2并开启服务(80端口)

      apt install apache2 &&service apache2 start

    • 安装Suricata

      apt-get install suricata    #install binary packages in kali(debian)
      
      
    • Shellshock漏洞利用介绍

      漏洞原理:利用Apache CGI创建环境变量时的漏洞,将有害代码注入环境变量中,然后利用bash漏洞执行注入的有害代码。

      1. bug1 用户请求可以创建环境变量
        Apache CGI处理用户请求信息时,使用了环境变量,在Apache处理headers信息创建环境变量,例如http header中有一个名为ang字段名称,这时CGI会创建一个HTTP_ANG的环境变量,然后传输到服务器的Bash去处理。

      2. bug2 bash 区分函数和变量的bug
        bash中,创建函数和创建变量都使用相同的存储方式,二者的区分方式是 bash 函数以 (){ 开头。所以如果我们在定义环境变量的时候,定义的环境变量以(){ 开头,bash 程序会将该环境变量当成函数。
        但是如何让函数自动执行呢?

      3. bug3 自动执行函数体外的代码
        当我们在当前的bash shell进程下创建一个bash子进程的时候,新的子进程会读取父进程所有export的环境变量,并复制到自己的进程空间,在父进程的环境变量被复制到子进程的过程中,函数体外的代码被自动执行了

  • 实验步骤

    • Snort检测SQL注入和Shellshock漏洞攻击并联动iptables进行防御

      • 检测原理

        通过检测URL中是否包含SQL注入和Shellshcock漏洞利用必须的关键字判断用户是否有SQL注入和Shellshcock漏洞利用的动机。由于shellshock中只会在http header中进行代码注入,所以在检查shellshock时,content的检查范围只设置为http header。

      • 添加检测SQL注入的代码和Shellshock的规则:

        vim  /etc/snort/rules/cnss.rules  #打开文件进行编辑
        alert tcp any any -> any 80 (msg: "Error Based SQL Injection Detected-single quoto"; content: "27" ; sid:100000011; ) #检测用户访问的URL中是否含有单引号
        alert tcp any any -> any 80 (msg: "Error Based SQL Injection Detected-double qouto"; content: "22" ; sid:100000012; ) #检测用户访问的URL中是否含有双引号
        alert tcp any any -> any 80 (msg: "AND SQL Injection Detected"; content: "and" ; nocase; sid:100000060; ) #检测用户访问的URL中是否含有 and
        alert tcp any any -> any 80 (msg: "OR SQL Injection Detected"; content: "or" ; nocase; sid:100000061; ) #检测用户访问的URL中是否含有 or
        alert tcp any any -> any 80 (msg: "Order by SQL Injection"; content: "order" ; sid:1000005; ) #检测用户访问的URL中是否含有 order 
        alert tcp any any -> any 80 (msg: "UNION SELECT SQL Injection"; content: "union" ; sid:1000006; ) #检测用户访问的URL中是否含有union语句
        alert tcp any  any -> any 80 (msg:"Possible CVE20146271 BASH Vulnerability Requested (header) ";flow:established,to_server; content:"() {"; http_header; threshold:type limit,track by_src, count 1, seconds 120; sid:2014092401;) #检测用户访问的HTTP请求中  header中是否包含 () { 
        
      • 规则测试

        • SQL注入检测

          cd /root/guardian

          perl guardian.pl -c guardian.conf #启动 guardian.pl

          snort -q -A fast -b -i eth1 -c /etc/snort/snort.conf -l /var/log/snort/ #打开Snort进行抓包

          分别在URL中包含 " OR AND order union 等关键字,guardian监视窗口中出现警告,截图如下。

          图一
          图二

          查看/var/log/snort/ 路径下增加了一个 log日志

          但是在触发规则前后,iptables规则并无变化(没有出现先增加规则,然后规则又被删除的情况)???

        • Shellshock漏洞利用检测
          原理: 构造一个 HTTP Header 中包含有可疑字符串() { 的数据包,然后观察Snort是否能检查到该可疑字符串。

          • 想用 curl 实现,在Attacker中运行如下语句curl -H "User-Agent: () { (a)=>\' sh -c "echo date"; cat echo" 192.168.29.123 #向服务器发送包含 () { 的数据包

          但是在服务器端的guardian 没有任何输出。

          我在服务器端打开wireshark进行抓包,的确发现了包含() {的文件符合条件的数据包。

          图三

          不知道为什么匹配不上我定义的Snort规则????

    • Suricata检测SQL注入和Shellshock漏洞攻击并联动iptables进行防御

      • 首先添加用户自定义规则到文件中

        vim  /etc/suricata/rules/local.rules   #首先打开用于存储的文件
        将规则添加到文件中(和Snort相同的规则)
        
        然后修改配置文件,将用户自定义的规则添加到配置文件中
        vim nano /etc/suricata/suricata.yaml
        在 rule-files 中新增加一项  - local.rules   保存退出
        
        
      • 然后修改guardian 的配置文件实现与 iptables 联动

        cd /root/guardian
        vim guardian.conf    #打开配置文件
        
        修改 LogFile 的配置路径为 suricata的日志路径    /var/log/guardian.log
        保存退出
        
      • 规则测试
        测试方法同Snort。

        首先打开 suricata
        suricata -c /etc/suricata/suricata.yaml -i eth1 -l /var/log/suricata/

        然后打开guardian

        在Attacker中使用浏览器访问 Victim,当URL中带有SQL注入关键字 and or order等关键字时,suricata中输出如下:
        图四

        使用curl -H "User-Agent: () { (a)=>\' sh -c "echo date"; cat echo" 192.168.29.123访问Victim时,对应规则依然没有生效。

  • 实验九思考题

    • IDS与防火墙的联动防御方式相比IPS方式防御存在哪些缺陷?是否存在相比较而言的优势?

      首先明确一下三者的特点

      Firewall: 防火墙是一种协议控制机制,用于流量限制,但没有主动发现恶意流量的能力。

      IDS:入侵检测系统是一个旁路监听设备,没有也不需要跨接在任何链路上,可以根据流量特征检测入侵,但是并不能控制流量。所以需要与Firewalls协作对恶意流量防御。

      IPS:入侵防御系统是相当于具有流量控制能力的IDS,在检测到恶意流量时,可以通过网络协议,直接进行流量控制。

      IDS系统在“大规模组合式、分布式入侵”方面,还没有较好的解决办法,误报和漏报现象严重。

      相比之下,IPS具有检测和防御能力,可以直接在入口处就开始检测,而不是等进到内部网络以后再进行检测,IPS可以在应用层进行检测,弥补了传统的防火墙+IDS方案不能检测更多内容的不足,IPS可以进行更深度的流量检测。

    • 配置 Suricata 为 IPS 模式,重复 实验四 (内容参考自Setting up IPS/inline for Linux

      使用NFQ配置Suricata 为 IPS 模式,首选使用 suricata --build-info 检测是否具有对应的工具

      使用 suricata -c /etc/suricata/suricata.yaml -q 0 运行Suricata 的IPS模式(使用 0号队列)

      配置 iptables,以发送流量到0号队列中(不指定时默认0号队列),用于suricata 读取。

      sudo iptables -I INPUT -j NFQUEUE
      sudo iptables -I OUTPUT -j NFQUEUE
      

      使用 nmap 192.168.29.123 -A -T4 -n -vv 暴力扫描 Victim。

      由于上文中并未观察到guardian对iptables的操作,此处无法对比。

  • 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值