AWD_defense_record

AWD在dalao的帮忙下打了几场,队伍中两个web手,一个pwn手,当然web是一攻一防,pwn手就比较辛苦。我主要负责一些运维的事务,这里针对awd运维做一点小总结。

备份,很关键

window平台推荐winscp傻瓜操作。
Linux平台推荐将web目录打包,再下载

tar zcf backup.zip /var/www/html

隐藏用户

遇到过两次隐藏用户的坑了。

查看home目录下是否有其他用户
/etc/passwd是否有/bin/bash的用户

看到用户先su一下,看看是否可以直接切换(主办方有时候会预留)。
如果不可以在用弱口令爆破密码,有一次HD学长就根据这个通杀全场,具体脚本可以参考这里

提权

个人并不是很推荐,很多时候会费力不讨好,很多时候主办方给与的权限实在过小,不过小比赛提权还是相对容易。
这里推荐几款工具

LinEnum
Linux_Exploit_Suggester
linuxprivchecker.py

同时,github上也有人总结了历年影响较大的提权exp

linux-kernel-exploits

如果可以提权的话,删除系统中不必要的用户

删除后门

这里主要参考这里

find . -name '*.php' | xargs grep -n 'eval('
find . -name '*.php' | xargs grep -n 'assert('
find . -name '*.php' | xargs grep -n 'system('
find . -name '*.php' | xargs grep -n 'shell_exec'
find . -name '*.php' | xargs grep -n 'exec'
find . -name '*.php' | xargs grep -n 'proc_open'
find . -name '*.php' | xargs grep -n -E 'preg_replace*e'1

同时这里配合D盾查杀,就删除后门。
不过有时候主办方的后门会十分隐蔽,这个时候就需要借助什么都报的seay源码审计工具来配合查找后门,找到后门第一时间交给负责攻击的人。

流量监控

在条件比较宽松的情况下

这里采用wupco师傅的脚本,十分方便

git clone https://github.com/wupco/weblogger

一套集成,然后直接用里面的一套就好

然后批量包含就好

find /var/www/html/ -path /var/www/html/124687a7bc37d57cc9ecd1cbd9d676f7 -prune -o  -type f -name '*.php'|xargs  sed -i '1i'

在条件比较苛刻的情况下

这里就采用virink师傅的脚本,github之前的删掉了,参考这里

 $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"]; 
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']);
$input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);

logging($input);

}

function logging($var){ 
$filename = $_SERVER['REMOTE_ADDR'];
$LOG_FILENAME = LOG_FILEDIR."/".$filename;
$time = date("Y-m-d G:i:s");
file_put_contents($LOG_FILENAME, "\r\n".$time."\r\n".print_r($var, true), FILE_APPEND); 
file_put_contents($LOG_FILENAME,"\r\n".'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'], FILE_APPEND);
file_put_contents($LOG_FILENAME,"\r\n***************************************************************",FILE_APPEND);
}

waf(); 
?>

然后

require_once('waf.php');

就会在当前目录生成logs,里面就是数据包

上传文件解析问题

.htaccess



Options -ExecCGI -Indexes
AllowOverride None
RemoveHandler .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
RemoveType .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
php_flag engine off

deny from all


文件监控

文件监控一种比较方便的方法就是提前准备好pyinotify库

sudo pythonXXX setup.py install

也可以直接将自己的目录复制下来,到时候直接传到服务器的目录上就好

/usr/local/lib/python2.7/dist-packages

在配置文件可控的情况下

参考这里

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ** Author: ssooking
import os
import argparse
from pyinotify import WatchManager, Notifier,ProcessEvent
from pyinotify import IN_DELETE, IN_CREATE,IN_MOVED_TO,IN_ATTRIB
class EventHandler(ProcessEvent):
        """事件处理"""
        #创建
        def process_IN_CREATE(self, event):
            print "[!] Create : " + event.pathname
            DeleteFileOrDir(event.pathname)
        #删除
        def process_IN_DELETE(self, event):
            print "[!] Delete : " + event.pathname
        #文件属性被修改,如chmod、chown命令
        def process_IN_ATTRIB(self, event):
            print "[!] Attribute been modified:" + event.pathname
        #文件被移来,如mv、cp命令
        def process_IN_MOVED_TO(self, event):
            print "[!] File or dir been moved to here: " + event.pathname
            DeleteFileOrDir(event.pathname)
def DeleteFileOrDir(target):
    if os.path.isdir(target):
        fileslist = os.listdir(target)
        for files in fileslist:
            DeleteFileOrDir(target + "/" + files)
        try:
            os.rmdir(target)
            print "     >>> Delete directory successfully: " + target
        except:
            print "     [-] Delete directory failed: " + target
    if os.path.isfile(target):
        try:
            os.remove(target)
            print "     >>> Delete file successfully" + target
        except:
            print "     [-] Delete file filed:  " + target
def Monitor(path):
        wm = WatchManager()
        mask = IN_DELETE | IN_CREATE | IN_MOVED_TO | IN_ATTRIB
        notifier = Notifier(wm, EventHandler())
        wm.add_watch(path, mask,rec=True)
        print '[+] Now Starting Monitor:  %s'%(path)
        while True:
                try:
                        notifier.process_events()
                        if notifier.check_events():
                                notifier.read_events()
                except KeyboardInterrupt:
                        notifier.stop()
                        break
                        
if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        usage="%(prog)s -w [path]",
        description=('''
            Introduce:Simple Directory Monitor!  by ssooking''')
    )
    parser.add_argument('-w','--watch',action="store",dest="path",default="/var/www/html/",help="directory to watch,default is /var/www/html")
    args=parser.parse_args()
    Monitor(args.path)

在python配置目录不可控的情况下

参考这里寻找的脚本,放置到可以写读的目录,自动删除创建的php文件

#!/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

这样,前期的工作已经完成。

假flag

这里参考一航师傅

curl

alias curl='python -c "__import__(\"sys\").stdout.write(\"flag{%s}\\n\" % (__import__(\"hashlib\").md5(\"\".join([__import__(\"random\").choice(__import__(\"string\").letters) for i in range(0x10)])).hexdigest()))"'
cat 

alias cat='python -c "__import__(\"sys\").stdout.write(\"flag{%s}\\n\" % (__import__(\"hashlib\").md5(\"\".join([__import__(\"random\").choice(__import__(\"string\").letters) for i in range(0x10)])).hexdigest()))"'

代码审计

前期已经将一些基础的内容都做了,这里就开始代码审计
首先推荐用seay源码审计工具扫描查看sql注入,文件上传等情况

sql注入
addslashes()
mysql_real_escape_string()

其实awd中主要还是根据官方后门来打,源码审计出新漏洞一般都是抄作业,新手还是很难挖掘出漏洞的

杀不死马

1.重启服务(一般没权限)
2.

参考:

https://github.com/admintony/Prepare-for-AWD
https://blog.csdn.net/qq_42572322/article/details/81700635

你可能感兴趣的:(AWD_defense_record)