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