Web【AWD攻防技巧】
梳理信息资产
无论是从比赛,还是说实际工作方面,信息的收集往往是最重要也是最关键的。也正如那句话:
知己知彼,百战不殆。
因为是AWD模式,往往时间非常紧迫,因此我们需要知道一些常用的命令来快速找到一些有价值的信息
组件信息:
find / -name "nginx.conf" #定位nginx目录
find / -path "*nginx*" -name nginx*conf #定位nginx配置目录
find / -name "httpd.conf" #定位apache目录
find / -path "*apache*" -name apache*conf #定位apache配置目录
用户信息:
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 命令
find / -name "index.php" #定位网站目录
find / -name "index.jsp"
日志发现:
/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 #实时刷新滚动日志文件
文件监控:
文件监控能及时木马文件后门生成,及时删除防止丢分。
find / -type f -name "*.php" -mtime -7 #查找最近修改过的 PHP 文件(例如过去 7 天内修改的)
其他常用命令:
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应用后台口令。
passwd username #ssh口令修改
set password for mycms@localhost = password('123'); #MySQL密码修改
find /var/www//html -path '*config*’ #查找配置文件中的密码凭证
关闭不必要的服务端口:
systemctl list-units --type=service #查看当前运行的服务
systemctl disable <服务名>
采用工具脚本等:
linux文件监控(网上找的)
#!/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
tar -cvf web.tar /var/www/html
zip -q -r web.zip /var/www/html
解压文件:
tar -xvf web.tar -c /var/www/html
unzip web.zip -d /var/www/html
备份到服务器:
mv web.tar /tmp
mv web.zip /home/xxx
上传下载文件:
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等文件获取。
mysqldump –u username –p password databasename > bak.sql
备份所有数据库:
mysqldump –all -databases > bak.sql
导入数据库:
mysql –u username –p password database < bak.sql
代码审计
将文件备份下来后,方便在本地开展代码审计等工作,因此为时间紧迫,我们可以使用一系列的查杀、审计工具等。
- D盾:查杀后门
- seay源代码审计:审计代码
AWD模式中存在的后门:
-
官方后门 / 预置后门
# 可以使用下面的代码进行查找(通杀) find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\(' -
常规漏洞 如SQL注入 文件上传 代码执行 序列化及反序列化...
-
选手后门(选手后期传入的木马)
漏洞修复
在代码审计结束后,及时对自身漏洞进行修补,要注意的是漏洞修复遵循保证服务不长时间宕机的原则, 应当多使用安全过滤函数,能修复尽量修复,不能修复先注释或删除相关代码,但需保证页面显示正常。
应急响应
通过命令查看可疑文件:
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、杀掉进程
ps [aux](https://so.csdn.net/so/search?q=aux&spm=1001.2101.3001.7020) | grep www-data | awk ‘{print $2}’ | xargs kill -94、条件竞争
杀进程后重启服务,写一个同名的文件夹和写一个sleep时间低于别人的马(或者写一个脚本不断删除别人的马)
比如写个马来一直杀死不死马进程:
<?php system("kill -9 pid;rm -rf .shell.php"); ?> #pid和不死马名称根据实际情况定
后门用户查杀:
UID大于500的都是非系统账号,500以下的都为系统保留的账号,使用userdel -r username 完全删除账户
其他查杀:
部分后门过于隐蔽,可以使用ls -al命令查看所有文件及文件修改时间和内容进行综合判断,进行删除。可以写脚本定时清理上传目录、定时任务和临时目录等
进程查杀
ps -aux #查看进程
kill -9 pid #强制进程查杀
关闭端口
netstat -anp #查看端口
firewall-cmd --zone= public --remove-port=80/tcp –permanent #关闭端口
firewall-cmd –reload #重载防火墙

浙公网安备 33010602011771号