一、前言
这篇文章是为了准备即将到来的线下赛,到时候估计不能联网所以。。。
二、常用命令
1、口令修改
需要修改的口令包括:ssh弱口令、CMS后台弱口令、数据库root口令
1)修改ssh口令
这个一定要修改,首先登陆SSH,然后:passwd [user]
2)CMS后台弱口令
CMS后台得自己找找,有更好的方法以后更新
3)数据库root口令
mysql -u root -p
show databases;
use mysql
set password for root@localhost = password('123');
或者
update user set password = PASSWORD('需要更换的密码') where user='root';
flush privileges;
show tables; # 看看有没有flag
2、备份
1)站点源码备份
可以使用工具winscp
、xftp
和命令scp
、tar
,当然最快捷的还是用tar
tar
备份方法如下:
cd /var/www/html
tar -zcvf ~/backup/html.tar.gz *
还可以定时每十分钟备份一次:
#!/bin/bash
time=`date +%d%k%M`
tar -zcvf ~/backup/$time.tar.gz /var/www/html/
crontab -e
10 * * * * ~/webback.sh
还原的话方法如下:
rm -rf /var/www/html
tar -zxvf ~/backup/html.tar.gz -C /var/www/html
2)数据库备份
有时候数据库里可能也会有flag
首先是到网站源码中,翻一翻密码
cd /var/www/html
find .|xargs grep "password"
备份:
cd /var/lib/mysql #(进入到MySQL库目录,根据自己的MySQL的安装情况调整目录)
mysqldump -u root -p Test > Test.sql # 输入密码即可。
mysqldump -u root -p --all-databases > ~/backup.sql # 备份所有数据库
mysqldump -u root -p --all-databases -skip-lock-tables > ~/backup.sql # 跳过锁定的数据库表
还原:
$ cd /var/lib/mysql # (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录)
$ mysql -u root -p Test < Test.sql # 输入密码即可(将要恢复的数据库文件放到服务器的某个目录下,并进入这个目录执行以上命令)。
或者
$ mysql -u root -p
mysql> create database [database_name]; # 输入要还原的数据库名
mysql> use [database_name]
mysql> source backup.sql; # source后跟备份的文件名
3、网络控制
网络防护一定少不了 iptables了,但使用iptables需要有管理员权限。对于比赛环境,我们完全可以配置一个近乎苛刻的配置防火墙策略。
1)端口
只开放一些比赛的必要端口,也可以防止后门的连接
#开放ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
#打开80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
#开启多端口简单用法
iptables -A INPUT -p tcp -m multiport --dport 22,80,8080,8081 -j ACCEPT
#允许外部访问本地多个端口 如8080,8081,8082,且只允许是新连接、已经连接的和已经连接的延伸出新连接的会话
iptables -A INPUT -p tcp -m multiport --dport 8080,8081,8082,12345 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 8080,8081,8082,12345 -m state --state ESTABLISHED -j ACCEPT
2)限制ssh
限制ssh登陆,进行访问控制
#禁止从xx.xx.xx.xx远程登陆到本机
iptables -t filter -A INPUT -s xx.xx.xx.xx -p tcp --dport 22 -j DROP
#允许xx.xx.xx.xx网段远程登陆访问ssh
iptables -A INPUT -s xx.xx.xx.1/24 -p tcp --dport 22 -j ACCEPT
3)限制IP
限制IP的网络连接数和速度等,限制过快的连接频率
#全网IP的最大连接数为 30
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT
#全网IP在60秒内只允许最多新建15个连接
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
#允许外部访问本机80端口,且本机初始只允许有10个连接,每秒新增加2个连接,如果访问超过此限制则拒接 (此方式可以限制一些攻击)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 2/s --limit-burst 10 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
4)封ip
这个太狠了
#禁止从客户机1.1.1.4访问1.1.1.5上的任何服务
iptable -t filter -A FORWARD -s 1.1.1.4 -d 1.1.1.5 -j DROP
#封杀1.1.1.4这个IP或者某个ip段
iptables -I INPUT -s 1.1.1.4 -j DROP
iptables -I INPUT -s 1.1.1.1/24 -j DROP
4、一些零碎的命令
下面都是比较零碎但是常用的命令
ssh <-p 端口> username@ip
scp 文件路径 username@ip:存放路径
cat /root/.bash_history
#显示最近登录的5个帐号
last -n 5|awk '{print $1}'
#显示/etc/passwd的账户
cat /etc/passwd|awk -F ':' '{print $1}'
#查看UID为0的帐号
awk -F: '{if($3==0)print $1}' /etc/passwd
#查找777的权限的文件
find . -name "*.php" -perm 4777
#查找24小时内被修改的PHP文件
find ./ -mtime 0 -name "*.php"
#查看进程
ps aux | grep pid或者进程名
# 查看端口的使用情况
netstat -an
#查看已建立的网络连接及进程
netstat -antulp | grep EST
#查看指定端口被哪个进程占用
lsof -i:端口号 或者 netstat -tunlp|grep 端口号
#结束进程命令
kill PID
killall <进程名>
pkill <进程名>
pkill -u用户名
#封杀某个IP或者ip段
iptables -I INPUT -s source_ip[/mask] -j DROP
#禁止从某个主机ssh远程访问登陆到本机
iptable -t filter -A INPUT -s source_ip[/mask] -p tcp --dport 22 -j DROP
#备份mysql数据库
mysqldump -u 用户名 -p 密码 数据库名 > bak.sql
mysqldump --all-databases > bak.sql
#还原mysql数据库
mysql -u 用户名 -p 密码 数据库名 < bak.sql
#定时任务,在固定的时间间隔执行指定的系统指令或shell script
crontab [-u user] file_name
crontab [-u user] [-e |-l| -r]
#检测所有的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 -
三、其余的防御工作
1、上waf
上传脚本到对应的文件夹中
1)防护单个页面
在修改需要防护的页面,加入代码:require_once('waf.php');
2)防护整个站点
如果想整站防注,就在网站的一个公用文件中添加上述代码来调用waf
常用的php的waf添加路径:
- PHPCMS V9:\phpcms\base.php
- PHPWIND8.7:\data\sql_config.php
- DEDECMS5.7:\data\common.inc.php
- DiscuzX2:\config\config_global.php
- Wordpress:\wp-config.php
- Metinfo:\include\head.php
还可以在php.ini中找到并添加:
Automatically add files before or after any PHP document.
auto_prepend_file = waf.php的路径;
最后最简便的方法,可以用一条命令解决,以php为例:
sudo find /var/www/html/path_you_want -type f -path "*.php" | xargs sed -i "s/<?php/<?php\nrequire_once('\/tmp\/waf.php');\n/g"
find /var/www/html/ -type f -path "*.php" | xargs sed -i "s/<?php/<?php\nrequire_once('\/tmp\/waf.php');\n/g"
#意思就是查找需要加waf的目录下所有php文件,在头部添加一句,用require_once函数引入/tmp/waf.php文件。因为sed命令利用 / 区分文件中的原字符串和修改的字符串,所以我们要对 / 进行转义。类似于在单引号中再次使用单引号时我们也要用反斜杠转义。
最后修改文件记得重启服务systemctl restart server_name
,并且密切关注服务的状态了
2、文件监控
需要提前准备好文件
python的第三方库pyinotify可以让我们很方便地实现这些功能
1)下载源文件
2)源文件上传服务器解压,然后执行sudo pythonXXX setup.py install
3)使用方法:python -m pyinotify monitoring_path
把monitoring_path
换成我们要监控的文件夹即可
4)或者用准备好的脚本python pymonitor.py
进行文件监控
3、流量和日志分析
1)流量分析
在比赛机器上使用下述命令进行流量抓取:
tcpdump -s 0 -w flow_log.pcap port 80
2)日志分析
日志记录获取也可以和waf一样,使用require_once('log.php');
这里就不说多了
脚本如下:
<?php
date_default_timezone_set('Asia/Shanghai');
$ip = $_SERVER["REMOTE_ADDR"];//记录访问者的ip
$filename = $_SERVER['PHP_SELF'];//访问者要访问的文件名
$parameter = $_SERVER["QUERY_STRING"];//访问者要请求的参数
$method = $_SERVER['REQUEST_METHOD'];//请求方法
$time = date('Y-m-d H:i:s',time());//访问时间
$post = file_get_contents("php://input",'r');//接收POST数据
$others = '...其他你想得到的信息...';
$logadd = '访问时间:'.$time.'-->'.'访问链接:http://'.$ip.$filename.'?'.$parameter.'请求方法:'.$method."\r\n";
// log记录
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fwrite($fh,print_r($_COOKIE, true)."\r\n");
fwrite($fh,$others."\r\n");
fclose($fh);
?>
可以提前下好工具进行日志分析
web日志取证分析工具
四、结语
本文全篇讲的都是命令或者工具,没有什么思路分析,等比赛结束后会出一个详细的思路分析
感谢两位师傅的博客:
CTF线下AWD经验总结
AWD学习笔记