湖湘杯决赛被打总结——AWD篇

简介

  菜鸡博主在上周参加了辣鸡湖湘杯的决赛(真香),然后被人吊着打到怀疑人生。虽然说这是第一次打AWD,但还是感觉自己太菜了,写个总结反思反思。

关于提权

  虽然说湖湘杯比赛用的系统版本贼新,但我觉得打AWD近期的提权脚本还是要准备一下的,就对于一些比较老的系统或者比较老版本的软件的提权脚本。毕竟,没有root权限干啥都难受,apt也用不了(虽然湖湘杯断网),dpkg也装不了应用,更关键的是看到别人打进来给挂的shell所有者居然是root,都删不掉,直接怀疑人生。

网络环境

  网络环境和想象中的不太一样,我天真地一位所有的服务器和我们的电脑络下,大家一起打就好了,然后惊奇地发现我们接入比赛网络之后只能通过一个类似于网关的东西访问自己的服务器,而不能直接连接到别人的服务器,必须要通过自己的服务器才能访问对手的服务器。

比赛过程

先检查代码

  比赛开始先把自己的/var/www/html目录下的文件download下来,然后丢进D盾里面扫了一下。。。看了看各种警告信息一脸懵逼。好在及时发现了一个名叫.shell.php的文件,打开一看是个一句话木马。emmmmmmm,估计是为了降低难度放在那边的?果断删掉这个文件,然后抬头看大屏幕。大屏幕上已经有选手开始攻击别的服务器了,而且这满屏的黄线一看就是批量利用脚本。

关于批量利用webshell

  看到这个我们也想批量打一波,然后发现一个严峻的问题——linux上用不了菜刀,但我们又不会写python脚本来连接一句话。这时突然想起之前屯了一个WebShell批量利用的脚本,传上去,然后输入

python console.py

然后服务器告诉我python not found, do you mean python3?我们当时只准备了python2版本的批量利用,天知道这个主办方只给装了python3,然后一脸懵逼地开始改代码,改了半天还改不出来,而且别的队伍基本都把一句话删掉了。此处给大家贴一个python一句话木马利用脚本

利用别人的攻击方式攻击其他选手

  我们可以选择流量监测脚本来监测对手的对你的服务器的访问(但是湖湘杯禁止任何类型的waf,我们也不敢用),可以尝试用对手攻击你的方式攻击你的其他对手。下面贴上代码

<?php
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) {
    date_default_timezone_set("Asia/Shanghai");//修正时间为中国准确时间
    $time=date("Y-m-d H:i:s");//将时间赋值给变量$time
    file_put_contents(LOG_FILENAME, "\r\n\r\n\r\n" . $time . "\r\n" . print_r($var, true) , FILE_APPEND);
    // die() or unset($_GET) or unset($_POST) or unset($_COOKIE);

}
waf();
?>

保护自己的文件

  别人攻击进来肯定要挂Webshell,我们可以通过文件监控,将新增的文件或者被修改的文件删除来保护自己(当然要注意检查自己的服务有没有Down掉,不然扣分贼恐怖)。文件监控脚本如下:

#!/usr/bin/python
#coding=utf-8
#Usage :python demo.py
#Code by : AdminTony
#QQ : 78941695
#注意:要将此文件放在有读写权限的目录以及所有修改过的php必须在此目录或者该目录的子目录中。
#作用:读取被修改过的文件,然后将文件的地址加上内容全部存放在txt



import sys,subprocess,os
#查找最近10分钟被修改的文件
def scanfile():
    #command: find -name '*.php' -mmin -10
    command = "find -name \'*.php\' -mmin -10"
    su = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    STDOUT,STDERR = su.communicate()
    list = STDOUT.split("\n")
    #print str(list)
    #将文件处理成list类型然后返回。
    return list

#读取文件:
def loadfile(addr):
    data = ""
    #如果文件不存在就跳出函数
    try :
        file = open(addr,'r')
        data = file.read()
    except : 
        return 0
    all_data = addr+"\n"+data+"\n\n"
    file1 = open("shell.txt",'a+')
    #避免重复写入
    try:
        shell_content = file1.read()
    except:
        shell_content = "null"
    #如果文件内容不为空再写入,避免写入空的。
    #print shell_content
    if data :
        if all_data not in shell_content:
            file1.write(all_data)
    file.close()
    file1.close()
    rm_cmd = "rm -rf "+addr
    su = subprocess.Popen(rm_cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    su.communicate()
    print "loadfile over : "+addr

if __name__ == '__main__':
    while True:

        list = scanfile()
        if list :
            for i in range(len(list)):
                #如果list[i]为空就不读取了
                if list[i]:
                    loadfile(str(list[i]))
        else : pass
sunyq

sunyq

一个苦逼的程序员,一不小心入了安全的坑,从此再也无法从坑里走出来。每天被大佬按在地上摩擦,希望大佬放过这个简陋的小站,别日了。

4 Comments

  • image

    关于网络环境状况,你不吐槽下么,能好好的做题么

      image

      @liuz 好像很有道理的样子,内网环境还经常坏

  • image

    孙神Tql

    image

    我上次去打网鼎杯跟博主情况差不多… 各路神仙打架,4台靶机有3台式pwn的…. 腾讯的eee战队从开始打到最后… 内心一片昏暗… 博主能给个联系方式咩?一起搅基呀!我QQ:425331590

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>