线下赛混战加固

最近有比赛,所以在此收集+总结 分享一下加固的思路。

比赛开始一般会有15-30分钟左右的加固时间。

拿到靶机,第一步应该是修改root密码(一般都不会给root用户)。如果主办方随机生成的高强度密码,方可没必要。

服务安全

查找后门用户/etc/passwd,如admin、guset等。同时用九头蛇去跑一下后门用户的弱口令。”观察一下木马文件(奇怪的文件名),之前有个漏洞就是在/root目录下存在多个序号命名的文件,如果扫描端口会发现文件名正是所开启一些端口的序号,通过netcat连接就可命令执行,且查看root用户所应有的文件”

web安全

首先要备份网站,这是必然的。然后检查网站里全部文件(隐藏文件)是否存在木马文件。其次检查网站功能性界面存在的web漏洞。如文件上传、文件包含、命令执行、sql注入、目录穿越等。

数据库安全

有站点的地方自然有数据库。数据库我们主要防范数据库用户密码。

配置安全

修改配置文件,如禁用在php.ini中禁用一些危险函数。

 

一、服务器后门端口

首先删除这些危险文件,如果直接kill进程,端口仍有可能重启。

使用命令netstat -lntup 查看所有开放的服务与端口,例:然后使用pkill -9 “autorunp*”杀掉进程。

pkill 与 kill 不同之处,pkill可直接指定进程名字,更方便,类似于killall。kill 需要配合ps + uid。

二、数据库加固

先查询数据库有哪些用户,在修改密码。

select user,host from mysql.user;
use mysql;
update user from password=password("新密码") where user="用户名";
flush privileges;

mysql5.7以后的版本就不支持以上的方法了,下面是5.7以后的版本。

use mysql;
alter user "root"@"localhost" identified with mysql_native_password by "新密码";
flush privileges;

用mysqladmin修改密码。

mysqladmin -uroot -p旧密码 password 新密码

如果不知道自己的密码,打开 /etc/my.cnf。保存后再打开MySQL无需密码。

添加:

[mysqld]
skip-grant-tables

当然如果暴力删除用户也是可以的。

drop 'user'@'localhost' //用户名

三、配置文件加固

主要针对http.conf和php.ini。

首先是php.ini目录一般都会在/etc/php/…/…/下。

禁用危险函数:

找到disable_functions,添加:

phpinfo,chroot,chown,chmod,system,shell_exec,passthru,exec,assert,pcntl_exec,proc_open,``,phpfunc,proc_get_status,chgrp,popen,get_cfg_va
  • 执行提权命令类,chroot,chgrp,chown,ini_set,ini_alter,ini_restore,get_cfg_var popen
  • 执行系统命令类,exec,passthru,system,shell_exec,popen,
  • 探测信息路径类,phpinfo,chroot,proc_get_status,
  • 执行越权写入类,proc_open,error_log,dl,pfsockopen,syslog,readlink,symlink,stream_socket_server,putenv

安全设置

开启安全模式(5.3版本后取消了好像):设置“safe_mode”为“on”

关闭远程文件包含 allow_url_fopen = On、allow_url_include = Off

关闭文件上传功能: file_uploads = Off

上传文件的存储位置: upload_tmp_dir = /xxx/xxx

文件上传最大限制: upload_max_filesize = xxM KB?

http.conf的加固

apache2:禁止脚本执行

打开 /etc/apache2/apache2.conf添加如下文件内容:

<Directory /var/www/html/a/>

        Options Indexes FollowSymLinks

        AllowOverride All

        <Files ~ "\.(?i:php|php2|php3|php4|php5|phpm|phpml|phtml|phtm|phps|pht|asp|aspx|asa|cer|cdx|ashx|exe|sh|bash|jsp|jspx|jspa|html|web.config|cfm|cgi|war|ashx|htaccess|py|pl)$">

                Order allow,deny

                Deny from all

        </Files>

</Directory>

关闭apache报错信息:

/etc/apache2/apache2.conf

在后面加入

ServerTokens Prod

ServerSignature Off

更改网站的权限

chown -R www-data /var/www/html/

chgrp -R www-data /var/www/html/

nginx禁止脚本执行

在/usr/local/nginx/conf/nginx.conf中添加如下内容

location ~* /(uploads|images)/.*\.(php|php2|php3|php4|php5|phpm|phpml|phtml|phtm|phps|pht|asp|aspx|asa|cer|cdx|ashx|exe|sh|bash|jsp|jspx|jspa|html|web.config|cfm|cgi|war|ashx|htaccess|py|pl)$

        {

                deny all;

        }

关闭报错:php_flag[display_errors] = off  

错误日志的记录地方:php_admin_value[error_log] = /data/www/log/error.log

以上修改文件配置均需要重启服务,所有需要比较高的权限

 

四、Web加固

web中有很多种不可控因素,因此下面只演示常规的加固手段。

SQL注入,分为两种整形和字符型。如果是整型直接套用intval()即可。

......

$id = intval($_POST['id']);
$sql = "select * from users where id=$id";
$query = mysql_query($sql);
......

字符型,在比赛中套用waf,不影响正常查询就🆗:

error_reporting(0); #关闭报错,在头加上

if(isset($_GET['id']))
{
$id=$_GET['id'];
......
function mdzz($id){

$id = preg_replace('/[\/|\*|\;]/', "", $id);

$id = preg_replace('/[-]/',"",$id);

$id = preg_replace('/[a-z]/',"shab",$id);

return $id;

}


$id = strtolower($_GET['id']);
$id = mdzz($id);
$id = mysql_real_escape_string($id);
$sql = "select * from users where id="($id) LIMIT 0,1";

......
}

multi_query() #可以查询多条语句,防范堆叠注入!

既然是比赛不影响正常运行还可以玩点花里胡哨的 等等等:

$re = preg_match('/[a-z]/',$id);
if (($re)==true){
sleep(500000);
}

文件上传

文件上传比较繁琐一点,下面只是列举,具体还要靠情况修改代码调试

uploaded/upload

error_reporting(0); #关闭报错,在头加上
$is_upload = false;
......

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $upload_name = $_FILES[ 'upload_file' ][ 'name' ];#获取文件名
        $upload_ext  = substr( $upload_name, strrpos( $upload_name, '.' ) + 1);#获取后缀名
        $upload_name = time().'.'.$upload_ext;#重命名
        $upload_type = $_FILES[ 'upload_file' ][ 'type' ];
#获取文件类型
        $ext_arr = array('jpg','png','gif');#判断后缀arr
        $upload_size = $_FILES['upload_file']['size'];
        $img_path = UPLOAD_PATH . '/' . $upload_name;

        if(move_uploaded_file($temp_file,$img_path) && (in_array($upload_ext,$ext_arr)) && ($upload_size < 10000000) && (in_array($upload_ext,$ext_arr))){
          $is_upload = ture;
          echo $upload_size;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

.......

还是那句话既然是比赛,就没有必要那么规矩的走流程,如果有权限可修改upload权限 chmod 000 uploads

#$upload_size = $_FILES[ 'upload' ][ 'size' ];#获取文件大小
if($upload_size < 999999999999){
sleep(60);
exit();
}

查看1分钟内新增的文件:find ./ -cmin -1 2> /tmp/null(改个文件名看看他的payload~~)

命令注入

简单的注入,比赛一般不会这么简单^^^^^,找到关键位置,正则过滤

$res = FALSE;                                                          
                                                                       
if (isset($_GET['ip']) && $_GET['ip']) {                               
#escapeshellcmd($_GET['ip']);                                          
$_GET['ip'] = preg_replace('/[a-z|;|&|\|]/','127.0.0.1',($_GET['ip']));
#过滤,非正常
    $cmd = "ping -c 4 {$_GET['ip']}";                                  
    $cmd = escapeshellcmd($cmd);#使用函数转移符号
    echo $cmd;                                                         
    exec($cmd, $res);                                                  
}                                                                      

同上,正常运行就行,可以直接删掉system等函数,替换成其他的一样可行。

文件包含

远程文件包含,在php.ini里修改配置文件(root)

allow_url_fopen = Off(是否允许打开远程文件)
allow_url_include = Off(是否允许include/require远程文件)

本地文件包含

include()

include_once( )

require( )

require_once( )

一、include('绝对路径、绝对文件名');
include('/var/www/html'.$file.'.php');


二、正则过滤 preg_replace('/(\.\.\/)|(\.\/)|(data)|(input)|(filter)/','',$file);


实例:
<?php

 $file = $_GET[ 'page' ];
 $flag = 'flag{ffa9fffb075a0a738b072a7d773ea301}';
 $file = preg_replace('/(\.\.\/)|(\.\/)|(data)|(input)|(filter)|(file)|(phar)|(http)|(zlib)|(00)/','',$file);
 #print_r($file);
 if(preg_match('(flag)',$file)){
 echo $flag;
}
 else{
include($file);
 }

?>

流量监控:

一、weblogger

克隆到服务器,修改权限777,最少apache用户要有700权限。

浏览器打开install.php

访问返回的文件/var/www/html/bd629c800e6ddafc95ef3364204c14ac/f40018c7060187cf2b9b281485434423/managelog.php

/tmp/aacd575b2646e46fe3d4a041c7b95270/weblogpro.php

替换PHP文件:

find /var/www/html/ -path /var/www/html/ef7d79d6d0f4d71e48615ac224ec165c/cc3029b50f1017e7b6d314712a472824 -prune -o -type f -name '*.php'|xargs sed -i '<?php require_once("/tmp/0fb8e4d8d06b24e098b710c9c48df564/weblogpro.php");?>'

刷新页面就可以看见日志了,进行反打

二、

PHP脚本

链接:https://pan.baidu.com/s/1q9Y1DlSaDXQf-IADbQ9YUg
提取码:gos5
写入监控PHP文件,并包含该文件

访问文件

文件监控:

一、

python2脚本:

链接:https://pan.baidu.com/s/1YLXHKGy5Xt4-jCaHKmDPRw
提取码:mbdh

二、

monitor.py:

链接:https://pan.baidu.com/s/1qK8_AGCFAgqMtCVtieLYGw
提取码:aa8a

日志分析:

一、360星图

二、

web-log-parser

报错就不演示了

后记

在比赛中有很多骚操作,臂如删除关机,命令、fork炸弹等等,都是靠慢慢积累的,今当远离,临表涕零,不知所言,多说无益,各位加油,祝成功!!!

留下评论