Web【AWD攻防技巧】

梳理信息资产

无论是从比赛,还是说实际工作方面,信息的收集往往是最重要也是最关键的。也正如那句话:

知己知彼,百战不殆。

因为是AWD模式,往往时间非常紧迫,因此我们需要知道一些常用的命令来快速找到一些有价值的信息

组件信息:
1
2
3
4
find / -name "nginx.conf"                 #定位nginx目录
find / -path "*nginx*" -name nginx*conf #定位nginx配置目录
find / -name "httpd.conf" #定位apache目录
find / -path "*apache*" -name apache*conf #定位apache配置目录
用户信息:
1
2
3
4
5
6
awk -F:'{if ($3==0) print $1}' /etc/passwd#可查询可登录账户UID为0的用户
awk -F :'{if(length($2)==0)print $1}' /etc/passwd #可查询无密码登录账户
cat /etc/passwd | grep '/bin/bash'#可查看可登录账户
lastb #可显示查看用户错误的登录列表,包括错误的登录方法、ip地址、时间等
lastlog #可查看系统中所有用户最后的登录信息
last #可查看用户最近登录信息(数据源为/var/log/wtmp、/var/log/btmp、/var/log/utmp;wtmp存贮登录成功的信息、btmp存储登录失败的信息、utmp存贮当前正在登录的信息)
网站发现:

通常都位于 /var/www/html 中,如果没有试试 find 命令

1
2
find / -name "index.php"   #定位网站目录
find / -name "index.jsp"
日志发现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/var/log/btmp:登录错误信息
/var/log/wtmp:记录登录进入、退出、数据交换、关机和重启。
/var/log/cron:记录与定时任务相关的日志信息。
/var/log/messages:记录系统启动后的信息和错误日志。
/var/log/apache2/access.log:记录Apache的访问日志。
/var/log/auth.log:记录用户登录和使用权限等。
/var/log/userlog:记录所有等级用户信息的日志。
/var/log/xferlog(vsftpd.log):记录Linux FTP日志。
/var/log/lastlog:记录最后一次登录的用户。
/var/log/secure:记录大多数应用输入的账户密码,及登录成功与否。
/var/log/faillog:记录登录系统不成功的账号信息。

/var/log/nginx/ #默认Nginx日志目录
/var/log/apache/ #默认Apache日志目录
/var/log/apache2/ #默认Apache日志目录
/usr/local/tomcat/logs #Tomcat日志目录
tail -f xxx.log #实时刷新滚动日志文件
文件监控:

文件监控能及时木马文件后门生成,及时删除防止丢分。

1
find / -type f -name "*.php" -mtime -7 #查找最近修改过的 PHP 文件(例如过去 7 天内修改的)
其他常用命令:
1
2
3
4
5
6
7
8
9
netstat -ano/-a    #查看端口情况
uname -a #系统信息
ps -aux ps -ef #进程信息
cat /etc/passwd #用户情况
ls /home/ #用户情况
id #用于显示用户ID,以及所属群组ID
find / -type d -perm -002 #可写目录检查
grep -r “flag” /var/www/html/ #查找默认FLAG

安全加固

修改默认口令:

不限于服务器SSH口令、数据库口令,WEB服务口令以及WEB应用后台口令。

1
2
3
passwd username    #ssh口令修改
set password for mycms@localhost = password('123'); #MySQL密码修改
find /var/www//html -path '*config*’ #查找配置文件中的密码凭证
关闭不必要的服务端口:
1
2
systemctl list-units --type=service #查看当前运行的服务
systemctl disable <服务名>
采用工具脚本等:

linux文件监控(网上找的)

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
#!/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

备份文件:

除了攻击成功可以让对手扣分,还能破坏对方环境使其宕机被check扣分;同时己方也有可能在修复过程中存在一些误操作,导致源码出错,致使服务停止;对页面快速恢复时,及时备份是必要的,因此页面备份至关重要。

压缩文件

要注意的是 有的题目环境可能不支持 zip

1
2
tar -cvf web.tar /var/www/html
zip -q -r web.zip /var/www/html

解压文件

1
2
tar -xvf web.tar -c /var/www/html
unzip web.zip -d /var/www/html

备份到服务器

1
2
mv web.tar /tmp
mv web.zip /home/xxx

上传下载文件

1
2
3
4
scp username@servername:/path/filename /tmp/local_destination  #从服务器下载单个文件到本地
scp /path/local_filename username@servername:/path #从本地上传单个文件到服务器
scp -r username@servername:remote_dir/ /tmp/local_dir #从服务器下载整个目录到本地
scp -r /tmp/local_dir username@servername:remote_dir #从本地上传整个目录到服务器

备份指定数据库

数据库配置信息一般可以通过如config.php/web.conf等文件获取。

1
mysqldump –u username –p password databasename > bak.sql

备份所有数据库

1
mysqldump –all -databases > bak.sql

导入数据库

1
mysql –u username –p password database < bak.sql

代码审计

将文件备份下来后,方便在本地开展代码审计等工作,因此为时间紧迫,我们可以使用一系列的查杀、审计工具等。

  • D盾:查杀后门
  • seay源代码审计:审计代码

AWD模式中存在的后门:

  • 官方后门 / 预置后门

    1
    2
    # 可以使用下面的代码进行查找(通杀)
    find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\('
  • 常规漏洞 如SQL注入 文件上传 代码执行 序列化及反序列化…

  • 选手后门(选手后期传入的木马)

漏洞修复

在代码审计结束后,及时对自身漏洞进行修补,要注意的是漏洞修复遵循保证服务不长时间宕机的原则, 应当多使用安全过滤函数,能修复尽量修复,不能修复先注释或删除相关代码,但需保证页面显示正常。

应急响应

通过命令查看可疑文件:

1
2
3
4
find /var/www/html -name *.php -mmin -20                         #查看最近20分钟修改文件
find ./ -name '*.php' | xargs wc -l | sort -u #寻找行数最短文件
grep -r --include=*.php '[^a-z]eval($_POST' /var/www/html #查包含关键字的php文件
find /var/www/html -type f -name "*.php" | xargs grep "eval(" |more
不死马查杀:

1、重启服务

2、删除并创建一个和不死马要生成的马,名字一样的路径及文件

3、杀掉进程

1
ps [aux](https://so.csdn.net/so/search?q=aux&spm=1001.2101.3001.7020) | grep www-data | awk ‘{print $2}’ | xargs kill -9

4、条件竞争

杀进程后重启服务,写一个同名的文件夹和写一个sleep时间低于别人的马(或者写一个脚本不断删除别人的马)

比如写个马来一直杀死不死马进程:

1
<?php system("kill -9 pid;rm -rf .shell.php"); ?>  #pid和不死马名称根据实际情况定
后门用户查杀:

UID大于500的都是非系统账号,500以下的都为系统保留的账号,使用userdel -r username 完全删除账户

其他查杀:

部分后门过于隐蔽,可以使用ls -al命令查看所有文件及文件修改时间和内容进行综合判断,进行删除。可以写脚本定时清理上传目录、定时任务和临时目录等

进程查杀
1
2
ps -aux  #查看进程
kill -9 pid #强制进程查杀
关闭端口
1
2
3
netstat -anp  #查看端口
firewall-cmd --zone= public --remove-port=80/tcp –permanent #关闭端口
firewall-cmd –reload #重载防火墙