theKingOfNight's Blog

CTF-Web-AWD_defense_record

Word count: 1.9kReading time: 9 min
2019/01/19 Share

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

备份,很关键

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

1
tar zcf backup.zip /var/www/html

隐藏用户

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

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

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

提权

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

1
2
3
LinEnum
Linux_Exploit_Suggester
linuxprivchecker.py

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

1
linux-kernel-exploits

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

删除后门

这里主要参考这里

1
2
3
4
5
6
7
8
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
find . -name '*.php' | xargs grep -n 'create_function'

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

流量监控

在条件比较宽松的情况下

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

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

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

然后批量包含就好

1
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之前的删掉了,参考这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?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();
?>

然后

1
require_once('waf.php');

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

上传文件解析问题

.htaccess

1
2
3
4
5
6
7
8
9
10
11
<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库

1
sudo pythonXXX setup.py install

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

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

在配置文件可控的情况下

参考这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/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

这里参考一航师傅

1
2
3
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()))"'

1
2
3
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注入,文件上传等情况

1
2
3
sql注入
addslashes()
mysql_real_escape_string()

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

杀不死马

1
2
3
4
5
6
7
8
9
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

CATALOG
  1. 1. 备份,很关键
  2. 2. 隐藏用户
  3. 3. 提权
  4. 4. 删除后门
  5. 5. 流量监控
    1. 5.1. 在条件比较宽松的情况下
    2. 5.2. 在条件比较苛刻的情况下
  6. 6. 上传文件解析问题
  7. 7. 文件监控
    1. 7.1. 在配置文件可控的情况下
    2. 7.2. 在python配置目录不可控的情况下
  8. 8. 假flag
  9. 9. 代码审计
  10. 10. 杀不死马
  11. 11. 参考: