awd运维手操作记录


一、前言

这篇文章是为了准备即将到来的线下赛,到时候估计不能联网所以。。。

二、常用命令

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)站点源码备份

可以使用工具winscpxftp和命令scptar,当然最快捷的还是用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_pathmonitoring_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学习笔记


文章作者: xi3w3n
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xi3w3n !
评论
  目录