AWD:赛前准备工作以及深度脚本讲解

  • A+
所属分类:安全文章

AWD:赛前准备工作以及深度脚本讲解

有幸被邀请代表学校去参加线下攻防,也就是俗称的AWD比赛。当然,在这一方面我也只能算是小白,所以希望各位大佬在看完我写的博客以后能指正一些错误。


一、比赛介绍


AWD赛制是按照分组来进行比赛的。每组3-4人,经过不同的分工,从而实现对服务器的维护以及对其他人的服务器进行攻击。 每个服务器都会有一个提前放好的有漏洞的网站,需要进行代码审计,然后修补漏洞。 举个例子,某些参数一可以参杂系统的cmd命令上来,如果执行成功,就会获取你服务器上某个文件夹下的flag.txt的内容,一旦获取成功,就代表被攻破。flag每隔一段时间都会刷新,所以可以一直被提取。最后比赛是按照你提的flag的数量来进行排名的。



二、分工


任务一:下载源码,源码备份,源码上传,查看日志 这个任务我感觉是最简单的了,首先使用xftp之类的软件链接到服务器,然后将源码拷贝下来就行了 。记得要做备份。 之后要做的就是等负责代码审计的人修补好漏洞以后将源码在传上去就行了。 至于最后一个,就是学会看日志。每个服务器都会记录访问请求,里面保存了所有访问记录。因此,有时候实在没有进攻思路,可以放开所有抱回,然后看看其他人是怎么打的你,在打回去就行了。


任务二:代码审计,写攻击防御脚本,修补漏洞 这个需要代码水平高的人来做,用得到的语言有php和python。 源码拿到以后,可以首先借助工具进行扫面,比如awvs,D盾之类的,如果扫描出漏洞就需要进行修补。 其次就是写脚本。这个我在后面会一一放出来,可以看看。


任务三:数据库注入 这个就是看数据库的漏洞,如果注入成功的话可以上传一句话木马。


三.脚本


由于我主要是负责任务二的,所以通篇都会对一些大佬的代码进行分析。后面也有一些我自己写的代码。



脚本1:Prepare-for-AWD-master(来源于gitHUB)


攻击的话,其实就是利用一些漏洞进行攻击。这个大佬给的东西挺全的。结构如图。


AWD:赛前准备工作以及深度脚本讲解


这里先分析防御脚本。


防御部分


1.linux文件监控脚本.py


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



其实大佬已经写的挺清楚了。


先看主函数,调用了一次scanfile()函数。


scanfile()函数: 通过分析可知,这个函数写了一个线程,调用了linux命令,用来查找创建时间小于10分钟的文件,然后处理成列表的形式返回查找到的文件名。


因此我们可以搞清楚了:主函数里面的list存放的是找到的所有符合条件的文件名。


接着走main函数里面的是一个判断。如果成功,就对列表中的每个文件进行loadfile()函数的操作。


loadfile()函数: 可以看到一个用法:try-except。这个代表着抛出异常,当except不写异常,就代表着抛出所有异常。 第一个异常处理是如果成功读取文件内容的话就继续执行,不成功就抛出异常,结束函数。 接着,在shell.txt文件中将刚才的文件名和内容保存下来。 然后就是第二个异常。shell_content变量里面保存的是刚读取的可以文件信息。 然后就是一个判断。这个判断是为了防止已经写入过了,因此加的。 最后,新建一个线程来执行删除文件的命令。


很好,我们目前已经搞清楚了。整个代码的流程大概是:


1、首先执行一个死循环,这个循环中执行两个函数。


2、先执行函数scanfile()进行文件扫描,无可疑文件就接着循环,有可疑文件就执行loadfile()函数。


3、执行loadfile()函数进行删除文件并记录上传的文件内容。


因此我们可以得出一个结论: 这个脚本主要是为了防御文件上传。因为会不断删除上传上来的文件,所以即使上传上来一句话木马也没用。你们可以对脚本进行修改,添加一些别的东西上去。


当然,也有缺陷。


1、防御的是对文件修改的东西,无法防御修改数据库的东西。当然,这也许是我异想天开了,大佬勿喷。


2、这个脚本必须是在服务器有python环境的情况下,因此万一没有python环境就凉凉了。而且python2和python3是不一样的,有一些地方需要修改。


所以,为了解决这个缺陷,我找了一个linux脚本,这样的话就可以不借助python的情况下来实现相同的功能。脚本如下:


#!/bin/bash while true do    find /var/www/dvwa/ -cmin -10 -type f | xargs rm -rf     sleep 1 done


注意要修改路径。这个路径是你比赛网站的位置。运行以后,会监控并删除(不会记录)可疑文件。当然,我也想写一个可以记录上传文件的代码,奈何技术不过关,我也不会写linux命令。

AWD:赛前准备工作以及深度脚本讲解AWD:赛前准备工作以及深度脚本讲解

AWD:赛前准备工作以及深度脚本讲解

本文始发于微信公众号(黑白之道):AWD:赛前准备工作以及深度脚本讲解

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: