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<?php require_once("/tmp/33253f64133730fabaa52a487ff98740/weblogpro.php");?>'

在条件比较苛刻的情况下

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

<?php

error_reporting(0); 
define('LOG_FILEDIR','./logs'); 
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"]; 
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


<Directory "/var/www/html/uploads">
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
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
deny from all
</FilesMatch>
</Directory>

文件监控

文件监控一种比较方便的方法就是提前准备好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.
<?php
while (1) {
    $pid=1234;
    @unlink('.demo.php');
    exec('kill -9 $pid');
}
?>

参考:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容