├── Ashro_linux.sh ├── README.md ├── weibu_md5.py 已经不能用了,被搞收费了 ├── 事件记录 └── 常用手敲命令快速盘点-持续更新 /Ashro_linux.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #!/bin/bash 3 | 4 | echo "Linux安全检查与应急响应工具" 5 | echo "Version: 2.0" 6 | echo "Author: Ashro" 7 | echo "Date: 2024-5-10" 8 | 9 | # 检查是否存在 ifconfig 命令,如果不存在则尝试使用 ip addr 命令 10 | if command -v ifconfig &>/dev/null; then 11 | ip_command="ifconfig -a" 12 | elif command -v ip &>/dev/null; then 13 | ip_command="ip addr" 14 | else 15 | echo "无法找到合适的命令来获取 IP 地址,请手动检查。" 16 | exit 1 17 | fi 18 | 19 | date=$(date +%Y%m%d-%H%M%S) 20 | ipadd=$($ip_command | grep -w inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d '/' -f 1) 21 | 22 | check_dir="/tmp/Ashro_${date}/check_file/" 23 | danger_file="/tmp/Ashro_${date}/danger_file.txt" 24 | log_dir="/tmp/Ashro_${date}/log/" 25 | webshell_file="/tmp/Ashro_${date}/webshell/" 26 | 27 | # 删除目录及文件,使用引号防止意外的空格或特殊字符 28 | rm -rf "$check_dir" "$danger_file" "$log_dir" "$webshell_file" 29 | mkdir -p "/tmp/Ashro_${date}/" # 使用 -p 选项以确保路径中的所有父目录都存在 30 | echo "检查发现危险项,请注意:" > "${danger_file}" 31 | mkdir -p "$check_dir" "$log_dir" "$webshell_file" 32 | cd "$check_dir" 33 | 34 | if [ "$(id -u)" != "0" ]; then 35 | echo "安全检查必须使用 root 账号,否则某些项无法检查。" 36 | exit 1 37 | fi 38 | 39 | Ashro_saveresult="tee -a ${log_dir}Ashro_checkresult.txt" 40 | echo -e "\n************ 1.系统范围 ************\n" | $Ashro_saveresult 41 | echo "正在检查 IP 地址....." | $Ashro_saveresult 42 | echo "------------- IP 及版本 -------------" 43 | echo "------------ IP 地址 -------------" 44 | echo "正在检查 IP 地址....." | $Ashro_saveresult 45 | if [ -n "$ipadd" ]; then 46 | (echo "[*] 本机 IP 地址信息:" && echo "$ipadd") | $Ashro_saveresult 47 | else 48 | echo "[!!!] 本机未配置 IP 地址" | $Ashro_saveresult 49 | fi 50 | printf "\n" | $Ashro_saveresult 51 | 52 | echo -e "************ 2.用户信息 ************\n" 53 | echo "------------ 查看登录用户 ------------" | $Ashro_saveresult 54 | echo "正在检查正在登录的用户....." | $Ashro_saveresult 55 | 56 | echo "[*] 系统登录用户:" | $Ashro_saveresult 57 | who | $Ashro_saveresult 58 | printf "\n" | $Ashro_saveresult 59 | 60 | echo "------------ 查看用户信息 ------------" | $Ashro_saveresult 61 | echo "正在查看用户信息....." | $Ashro_saveresult 62 | 63 | echo "[*] 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell" | $Ashro_saveresult 64 | cat /etc/passwd | $Ashro_saveresult 65 | printf "\n" | $Ashro_saveresult 66 | 67 | echo "------------ 检查超级用户 --------------" | $Ashro_saveresult 68 | echo "正在检查是否存在超级用户....." | $Ashro_saveresult 69 | 70 | Superuser=$(awk -F: '$3 == 0 && $1 != "root" { print $1 }' /etc/passwd) 71 | if [ -n "$Superuser" ]; then 72 | echo "[!!!] 除 root 外发现超级用户:" | tee -a "$danger_file" | $Ashro_saveresult 73 | else 74 | echo "[*] 未发现超级用户" | $Ashro_saveresult 75 | fi 76 | printf "\n" | $Ashro_saveresult 77 | 78 | echo "------------ 空口令账户检测 --------------" | $Ashro_saveresult 79 | echo "正在检查空口令账户....." | $Ashro_saveresult 80 | 81 | empty_password_accounts=$(awk -F: '($2 == "") {print $1}' /etc/shadow) 82 | 83 | if [ -n "$empty_password_accounts" ]; then 84 | echo "[!!!] 发现空口令账户:" | tee -a "$danger_file" | $Ashro_saveresult 85 | echo "$empty_password_accounts" | tee -a "$danger_file" | $Ashro_saveresult 86 | else 87 | echo "[*] 未发现空口令账户" | $Ashro_saveresult 88 | fi 89 | printf "\n" | $Ashro_saveresult 90 | 91 | echo "------------ 新增用户检查 --------------" | $Ashro_saveresult 92 | echo "正在检查新增用户....." | $Ashro_saveresult 93 | 94 | new_users=$(awk -F: '$3 >= 1000 && $3 != 65534' /etc/passwd) 95 | if [ -n "$new_users" ]; then 96 | echo "[!!!] 发现以下新增用户:" | tee -a "$danger_file" | $Ashro_saveresult 97 | echo "$new_users" | tee -a "$danger_file" | $Ashro_saveresult 98 | else 99 | echo "[*] 未发现新增用户" | $Ashro_saveresult 100 | fi 101 | printf "\n" | $Ashro_saveresult 102 | 103 | echo "------------ 新增用户组检查 --------------" | $Ashro_saveresult 104 | echo "正在检查新增用户组....." | $Ashro_saveresult 105 | 106 | new_groups=$(awk -F: '$3 >= 1000' /etc/group) 107 | if [ -n "$new_groups" ]; then 108 | echo "[!!!] 发现以下新增用户组:" | tee -a "$danger_file" | $Ashro_saveresult 109 | echo "$new_groups" | tee -a "$danger_file" | $Ashro_saveresult 110 | else 111 | echo "[*] 未发现新增用户组" | $Ashro_saveresult 112 | fi 113 | printf "\n" | $Ashro_saveresult 114 | 115 | # 检测sudoers文件中用户权限 116 | echo "------------ 检查sudoers文件中用户权限 --------------" | $Ashro_saveresult 117 | echo "正在检查sudoers文件中用户权限....." | $Ashro_saveresult 118 | 119 | # 使用 visudo 命令查找具有 NOPASSWD 权限的用户 120 | sudoers_users=$(visudo -c 2>&1 | grep -E '^[^#]*[[:space:]]ALL=.*NOPASSWD' | awk '{print $1}') 121 | 122 | if [ -n "$sudoers_users" ]; then 123 | echo "[!!!] 发现具有 NOPASSWD 权限的用户:" | tee -a "$danger_file" | $Ashro_saveresult 124 | echo "$sudoers_users" | tee -a "$danger_file" | $Ashro_saveresult 125 | else 126 | echo "[*] 未发现具有 NOPASSWD 权限的用户" | $Ashro_saveresult 127 | fi 128 | printf "\n" | $Ashro_saveresult 129 | 130 | # 检查各账户下登录公钥 131 | echo "------------ 检查各账户下登录公钥 --------------" | $Ashro_saveresult 132 | echo "正在检查各账户下登录公钥....." | $Ashro_saveresult 133 | 134 | # 获取所有用户目录路径 135 | home_dirs=$(getent passwd | cut -d: -f6) 136 | 137 | # 遍历所有用户目录 138 | for dir in $home_dirs; do 139 | authorized_keys_file="$dir/.ssh/authorized_keys" 140 | if [ -f "$authorized_keys_file" ]; then 141 | echo "[!!!] 在用户 $dir 下发现登录公钥:" | tee -a "$danger_file" | $Ashro_saveresult 142 | cat "$authorized_keys_file" | tee -a "$danger_file" | $Ashro_saveresult 143 | fi 144 | done 145 | 146 | printf "\n" | $Ashro_saveresult 147 | 148 | # 账户密码文件权限检测 149 | echo "------------ 账户密码文件权限检测 --------------" | $Ashro_saveresult 150 | echo "正在检查账户密码文件权限....." | $Ashro_saveresult 151 | 152 | # 定义函数检查文件权限 153 | check_permission() { 154 | file="$1" 155 | permission=$(stat -c "%a" "$file" 2>/dev/null) 156 | if [ -n "$permission" ] && [ "$permission" != "644" ]; then 157 | echo "[!!!] $file 文件权限异常!当前权限为 $permission" | tee -a "$danger_file" | $Ashro_saveresult 158 | else 159 | echo "[*] $file 文件权限正常" | $Ashro_saveresult 160 | fi 161 | } 162 | 163 | # 调用函数检查各密码文件权限 164 | check_permission "/etc/passwd" 165 | check_permission "/etc/shadow" 166 | check_permission "/etc/group" 167 | check_permission "/etc/gshadow" 168 | 169 | printf "\n" | $Ashro_saveresult 170 | 171 | # 检测暴力破解攻击 172 | echo "------------ 暴力破解攻击检测 --------------" 173 | echo "正在检测root是否遭受暴力破解攻击....." 174 | 175 | # 定义函数检测暴力破解攻击 176 | check_bruteforce() { 177 | logfile="$1" 178 | danger_file="/var/log/danger.log" # 定义危险日志文件路径 179 | 180 | if [ ! -f "$logfile" ]; then 181 | echo "[*] $logfile 不存在,暴力破解攻击检测未执行" 182 | return 183 | fi 184 | 185 | # 检测失败的root密码尝试并输出结果 186 | result=$(grep -a "Failed password for root" "$logfile" | awk '{print $11}' | sort | uniq -c | sort -nr) 187 | loginresult=$(grep "Accepted password for root" "$logfile" | awk '{print $11}' | sort | uniq -c | sort -nr | more) 188 | 189 | if [ -n "$result" ]; then 190 | echo "[!!!] 在 $logfile 中检测到失败密码尝试,可能遭受暴力破解攻击!" | tee -a "$danger_file" 191 | echo "详细信息如下:" | tee -a "$danger_file" 192 | echo "------------------------" | tee -a "$danger_file" 193 | echo "$result" | tee -a "$danger_file" | more 194 | echo "登录成功的ip如下:""$loginresult"| tee -a "$danger_file" 195 | else 196 | echo "[*] 在 $logfile 中暴力破解攻击检测正常" 197 | fi 198 | } 199 | 200 | # 调用函数检测暴力破解攻击 201 | check_bruteforce "/var/log/auth.log" 202 | check_bruteforce "/var/log/auth.log*" 203 | check_bruteforce "/var/log/secure" 204 | 205 | echo "" # 输出一个空行 206 | # 检测端口进程信息 207 | echo "************3.端口进程信息************" 208 | echo "------------网络连接---------------------" | $Ashro_saveresult 209 | echo "------------病毒木马端口检测------------------" | $saveresult 210 | echo "正在检测系统中的网络连接和监听端口....." | $saveresult 211 | 212 | # 检查正在监听的端口 213 | listening_ports=$(netstat -tuln | awk 'NR > 2 {print $4}' | awk -F':' '{print $NF}' | sort -nu) 214 | if [ -n "$listening_ports" ]; then 215 | echo "[] 系统中正在监听的端口如下:" | $saveresult 216 | echo "$listening_ports" | $saveresult 217 | 218 | # 输出每个监听端口的详细信息 219 | echo "------------详细的端口信息------------------" | $saveresult 220 | for port in $listening_ports; do 221 | echo "端口: $port" | $saveresult 222 | # 使用 lsof 列出详细信息 223 | lsof -i :$port | awk 'NR==1 || /LISTEN/' | $saveresult 224 | echo "----------------------------------------" | $saveresult 225 | done 226 | else 227 | echo "[] 系统中未发现正在监听的端口" | $saveresult 228 | fi 229 | 230 | # 检查建立的网络连接 231 | established_connections=$(netstat -tun | grep ESTABLISHED) 232 | if [ -n "$established_connections" ]; then 233 | echo "[!!!] 系统中存在建立的网络连接:" | tee -a "$danger_file" | $Ashro_saverult 234 | echo "$established_connections" | tee -a "$danger_file" | $Ashro_saverult 235 | 236 | # 分析建立的网络连接,查看是否有可疑连接 237 | suspicious_connections=$(echo "$established_connections" | awk '{print $5}' | grep -E '0.0.0.0:|127.0.0.1:' | sort -u) 238 | if [ -n "$suspicious_connections" ]; then 239 | echo "[!!!] 发现可疑的网络连接:" | tee -a "$danger_file" | $Ashro_saverult 240 | echo "$suspicious_connections" | tee -a "$danger_file" | $Ashro_saverult 241 | fi 242 | else 243 | echo "[*] 系统中未发现建立的网络连接" | $Ashro_saverult 244 | fi 245 | 246 | printf "\n" | $Ashro_saverult 247 | 248 | # 进程分析 249 | echo "------------进程分析---------------------" | $Ashro_saverult 250 | 251 | # 系统进程 252 | echo "------------系统进程------------------" | $Ashro_saverult 253 | echo "正在检查系统进程....." | $Ashro_saverult 254 | ps_output=$(ps aux) 255 | if [ -n "$ps_output" ]; then 256 | echo "[*] 系统进程如下:" | tee -a "$danger_file" | $Ashro_saverult 257 | echo "$ps_output" | tee -a "$danger_file" | $Ashro_saverult 258 | else 259 | echo "[*] 未发现系统进程" | $Ashro_saverult 260 | fi 261 | printf "\n" | $Ashro_saverult 262 | 263 | # 守护进程 264 | echo "------------守护进程------------------" | $Ashro_saverult 265 | echo "正在检查守护进程....." | $Ashro_saverult 266 | if [ -d "/etc/init.d" ]; then 267 | echo "[*] 系统守护进程:" | tee -a "$danger_file" | $Ashro_saverult 268 | ls -l /etc/init.d | grep "^-" | awk '{print $9}' | tee -a "$danger_file" | $Ashro_saverult 269 | else 270 | echo "[*] 未发现守护进程" | $Ashro_saverult 271 | fi 272 | printf "\n" | $Ashro_saverult 273 | 274 | # CPU和内存使用异常进程排查 275 | echo "------------CPU和内存使用异常进程排查------------------" | $Ashro_saverult 276 | 277 | # 查找CPU使用率最高的进程 278 | cpu_high_processes=$(ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 5) 279 | if [ -n "$cpu_high_processes" ]; then 280 | echo "[!!!] CPU使用率最高的进程:" | tee -a "$danger_file" | $Ashro_saverult 281 | echo "$cpu_high_processes" | tee -a "$danger_file" | $Ashro_saverult 282 | else 283 | echo "[*] 未发现CPU使用率异常的进程" | $Ashro_saverult 284 | fi 285 | 286 | # 查找内存使用率最高的进程 287 | memory_high_processes=$(ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%mem | head -n 5) 288 | if [ -n "$memory_high_processes" ]; then 289 | echo "[!!!] 内存使用率最高的进程:" | tee -a "$danger_file" | $Ashro_saverult 290 | echo "$memory_high_processes" | tee -a "$danger_file" | $Ashro_saverult 291 | else 292 | echo "[*] 未发现内存使用率异常的进程" | $Ashro_saverult 293 | fi 294 | 295 | printf "\n" | $Ashro_saverult 296 | 297 | # 隐藏进程和反弹shell类进程扫描 298 | echo "------------隐藏进程和反弹shell类进程扫描------------------" | $Ashro_saverult 299 | 300 | # 检查隐藏进程 301 | hidden_processes=$(ps aux | awk '{if($8 == "S" || $8 == "D") print $0}') 302 | if [ -n "$hidden_processes" ]; then 303 | echo "[!!!] 发现隐藏进程:" | tee -a "$danger_file" | $Ashro_saverult 304 | echo "$hidden_processes" | tee -a "$danger_file" | $Ashro_saverult 305 | else 306 | echo "[*] 未发现隐藏进程" | $Ashro_saverult 307 | fi 308 | 309 | # 检查反弹shell类进程 310 | # 查询所有监听端口的网络连接 311 | shell_processes=$(netstat -tuln | grep -E "nc -l -p|netcat|ncat|socat|shell|bind|reverse|listen|connect|exec|sh|bash|zsh|ksh|telnet|ssh|rsh|rcp|sshpass|pexpect|paramiko|plink|pscp|putty|ssh-keygen|ssh-agent|tsh|rbash|dash|mkfifo|expect|bash -c|python -c|perl -e|curl|wget|php -r|lua -e|bash -i|php -a|python -m|perl -M|ruby -e|perl -n|python -p|ruby -n|bash -s|php -l|wget -O|curl -o") 312 | if [ -n "$shell_processes" ]; then 313 | echo "[!!!] 发现反弹shell类进程:" | tee -a "$danger_file" | $Ashro_saverult 314 | echo "$shell_processes" | tee -a "$danger_file" | $Ashro_saverult 315 | else 316 | echo "[*] 未发现反弹shell类进程" | $Ashro_saverult 317 | fi 318 | 319 | printf "\n" | $Ashro_saverult 320 | 321 | 322 | # 检查进程对应的可执行文件并保存到指定目录 323 | echo "[*] 正在检查进程对应的可执行文件,并保存到目录:$webshell_file" | $Ashro_saveresult 324 | # 获取所有正在运行的进程的 PID 325 | pids=$(pgrep -d ' ' -f .) 326 | 327 | # 遍历所有 PID,复制其可执行文件到指定目录 328 | for pid in $pids; do 329 | # 获取进程对应的可执行文件路径 330 | process_executable=$(readlink -f /proc/"$pid"/exe) 331 | 332 | # 检查是否为有效路径 333 | if [ -n "$process_executable" ]; then 334 | # 获取进程名称 335 | process_name=$(basename "$process_executable") 336 | 337 | # 复制可执行文件到指定目录 338 | cp "$process_executable" "$webshell_file/$process_name-$pid" 339 | fi 340 | done 341 | 342 | echo "[*] 所有进程对应的可执行文件已保存到目录:$webshell_file" | $Ashro_saveresult 343 | 344 | echo "------------系统命令hash值打包------------------" | $Ashro_saveresult 345 | # 指定要保存CSV文件的路径和文件名 346 | csv_file="$check_dir/command_hashes.csv" 347 | # 创建CSV文件并写入标题行 348 | echo "Command Path,Hash Value" > "$csv_file" 349 | # 查找系统命令文件并计算哈希值 350 | find /bin /usr/bin -type f | while IFS= read -r file_path; do 351 | hash_value=$(md5sum "$file_path" | awk '{print $1}') 352 | echo "$file_path,$hash_value" >> "$csv_file" 353 | done 354 | 355 | echo "哈希值已保存到 $csv_file 文件中。" | $Ashro_saveresult 356 | 357 | 358 | echo "------------运行服务----------------------" | $Ashro_saveresult 359 | echo "正在检查运行服务....." | $Ashro_saveresult 360 | if command -v systemctl &>/dev/null; then 361 | if systemctl list-units --type=service --state=running &>/dev/null; then 362 | echo "[*]以下服务正在运行:" | $Ashro_saveresult 363 | systemctl list-units --type=service --state=running | awk '{print $1}' | $Ashro_saveresult 364 | else 365 | echo "未发现正在运行的服务!" | $Ashro_saveresult 366 | fi 367 | else 368 | echo "[!!!]Systemd 未安装,无法检查正在运行的服务。" | $Ashro_saveresult 369 | fi 370 | printf "\n" | $Ashro_saveresult 371 | 372 | echo "************4.关键文件************" | $Ashro_saveresult 373 | # 检查系统文件的权限变更 374 | # 保存信息到结果文件 375 | echo "------------系统文件的权限变更检查------------------" | $Ashro_saveresult 376 | echo "正在检查系统文件的权限变更....." | $Ashro_saveresult 377 | 378 | 379 | # 保存信息到结果文件 380 | echo "------------系统文件的权限变更检查------------------" | $Ashro_saveresult 381 | echo "正在检查系统文件的权限变更....." | $Ashro_saveresult 382 | 383 | # 查找最近一周内具有执行权限的普通文件,并输出文件名和修改日期 384 | changed_files=$(find / -type f -mtime -7 -executable -not -path "/tmp/Ashro*" 2>/dev/null) 385 | if [ -n "$changed_files" ]; then 386 | echo "[!!!]发现最近一周内具有执行权限的文件:" | tee -a "$danger_file" | $Ashro_saveresult 387 | echo "$changed_files" | while IFS= read -r file; do 388 | file_date=$(stat -c "%y" "$file") 389 | echo "$file ($file_date)" | tee -a "$danger_file" | $Ashro_saveresult 390 | done 391 | else 392 | echo "[*]未发现最近一周内有具有执行权限的文件" | $Ashro_saveresult 393 | fi 394 | 395 | echo | $Ashro_saveresult # 输出一个空行到结果文件中 396 | 397 | 398 | echo "------------历史命令--------------------------" | $Ashro_saveresult 399 | echo "正在检查操作系统历史命令....." | $Ashro_saveresult 400 | 401 | history_file="/root/.bash_history" 402 | if [ -s "$history_file" ]; then 403 | echo "[*]操作系统历史命令如下:" | $Ashro_saveresult 404 | cat "$history_file" | $Ashro_saveresult 405 | else 406 | echo "[!!!]未发现历史命令,请检查是否记录及已被清除" | tee -a "$danger_file" | $Ashro_saveresult 407 | fi 408 | 409 | printf "\n" | $Ashro_saveresult 410 | 411 | 412 | echo "-------------启动项-----------------------" | $Ashro_saveresult 413 | echo "-------------用户自定义启动项-----------------------" | $Ashro_saveresult 414 | echo "正在检查用户自定义启动项....." | $Ashro_saveresult 415 | chkconfig_output=$(chkconfig --list 2>/dev/null | grep -E ":on|启用" | awk '{print $1}') 416 | if [ -n "$chkconfig_output" ]; then 417 | (echo "[*]用户自定义启动项:" && echo "$chkconfig_output") | tee -a "$danger_file" | $Ashro_saveresult 418 | else 419 | echo "未发现用户自定义启动项" | $Ashro_saveresult 420 | fi 421 | printf "\n" | $Ashro_saveresult 422 | 423 | echo "-------------系统自启动项-----------------------" | $Ashro_saveresult 424 | echo "正在检查系统自启动项....." | $Ashro_saveresult 425 | systemctl_output=$(systemctl list-unit-files --type=service 2>/dev/null | awk '/enabled/ {print $1}') 426 | if [ -n "$systemctl_output" ]; then 427 | (echo "[*]系统自启动项如下:" && echo "$systemctl_output") | tee -a "$danger_file" | $Ashro_saveresult 428 | else 429 | echo "[*]未发现系统自启动项" | $Ashro_saveresult 430 | fi 431 | printf "\n" | $Ashro_saveresult 432 | 433 | echo "-------------危险启动项-----------------------" | $Ashro_saveresult 434 | echo "正在检查危险启动项....." | $Ashro_saveresult 435 | 436 | # 检查系统是否支持systemctl命令 437 | if command -v systemctl &>/dev/null; then 438 | # 使用systemctl命令获取启用的服务列表 439 | danger_startup=$(systemctl list-unit-files --type=service | grep enabled | awk '{print $1}' | grep -E "\.service$") 440 | if [ -n "$danger_startup" ]; then 441 | (echo "[!!!]发现危险启动项:" && echo "$danger_startup") | tee -a "$danger_file" | $Ashro_saveresult 442 | else 443 | echo "[*]未发现危险启动项" | $Ashro_saveresult 444 | fi 445 | else 446 | # 如果系统不支持systemctl命令,则输出提示信息 447 | echo "[!!!]系统不支持systemctl命令,无法检查启动项" | tee -a "$danger_file" | $Ashro_saveresult 448 | fi 449 | 450 | printf "\n" | $Ashro_saveresult 451 | 452 | 453 | echo "------------系统定时任务分析-------------------" | $Ashro_saveresult 454 | echo "------------查看系统定时任务-------------------" | $Ashro_saveresult 455 | echo "正在分析系统定时任务....." | $Ashro_saveresult 456 | syscrontab=$(grep -v "# run-parts" /etc/crontab 2>/dev/null | grep run-parts) 457 | if [ -n "$syscrontab" ]; then 458 | (echo "[!!!]发现存在系统定时任务:" && cat /etc/crontab ) | tee -a "$danger_file" | $Ashro_saveresult 459 | else 460 | echo "[*]未发现系统定时任务" | $Ashro_saveresult 461 | fi 462 | printf "\n" | $Ashro_saveresult 463 | 464 | echo "------------分析系统可疑定时任务-------------------" | $Ashro_saveresult 465 | echo "正在分析系统可疑任务....." | $Ashro_saveresult 466 | 467 | 468 | # 分析可疑定时任务 469 | dangersyscron=$(egrep "(chmod|useradd|groupadd|chattr|wget|curl|su|sudo|rsync).*\.(sh|pl|py|bash|ksh|csh|zsh)$" /etc/cron*/* /var/spool/cron/* 2>/dev/null) 470 | 471 | if [ -n "$dangersyscron" ]; then 472 | echo "[!!!]发现下面的定时任务可疑,请注意!!!" | tee -a "$danger_file" | $Ashro_saveresult 473 | echo "$dangersyscron" | tee -a "$danger_file" | $Ashro_saveresult 474 | else 475 | echo "[*]未发现可疑系统定时任务" | $Ashro_saveresult 476 | fi 477 | 478 | printf "\n" | $Ashro_saverult 479 | 480 | 481 | echo "------------分析用户定时任务-------------------" | $Ashro_saveresult 482 | echo "------------查看用户定时任务-------------------" | $Ashro_saveresult 483 | echo "正在查看用户定时任务....." | $Ashro_saveresult 484 | 485 | # 检查 /var/spool/cron 目录 486 | if [ -d "/var/spool/cron" ]; then 487 | for user_crontab in /var/spool/cron/*; do 488 | username=$(basename "$user_crontab") 489 | crontab_content=$(cat "$user_crontab" 2>/dev/null) 490 | if [ -n "$crontab_content" ]; then 491 | (echo "[!!!]用户 $username 的定时任务如下:" && echo "$crontab_content") | $Ashro_saveresult 492 | fi 493 | done 494 | else 495 | echo "[!!!]未找到 /var/spool/cron 目录,无法查找用户定时任务" | tee -a "$danger_file" | $Ashro_saveresult 496 | fi 497 | 498 | # 检查 /var/spool/cron/crontabs 目录 499 | if [ -d "/var/spool/cron/crontabs" ]; then 500 | for user_crontab in /var/spool/cron/crontabs/*; do 501 | username=$(basename "$user_crontab") 502 | crontab_content=$(cat "$user_crontab" 2>/dev/null) 503 | if [ -n "$crontab_content" ]; then 504 | (echo "[!!!]用户 $username 的定时任务如下:" && echo "$crontab_content") | $Ashro_saveresult 505 | fi 506 | done 507 | else 508 | echo "[!!!]未找到 /var/spool/cron/crontabs 目录,无法查找用户定时任务" | tee -a "$danger_file" | $Ashro_saveresult 509 | fi 510 | 511 | # 检查 /etc/crontab 文件 512 | if [ -f "/etc/crontab" ]; then 513 | crontab_content=$(cat /etc/crontab 2>/dev/null) 514 | if [ -n "$crontab_content" ]; then 515 | (echo "[!!!]/etc/crontab 定时任务如下:" && echo "$crontab_content") | $Ashro_saveresult 516 | fi 517 | else 518 | echo "[!!!]未找到 /etc/crontab 文件,无法查找系统定时任务" | tee -a "$danger_file" | $Ashro_saveresult 519 | fi 520 | 521 | # 检查 /etc/cron.d 目录 522 | if [ -d "/etc/cron.d" ]; then 523 | for cron_file in /etc/cron.d/*; do 524 | cron_content=$(cat "$cron_file" 2>/dev/null) 525 | if [ -n "$cron_content" ]; then 526 | (echo "[!!!]$cron_file 定时任务如下:" && echo "$cron_content") | $Ashro_saveresult 527 | fi 528 | done 529 | else 530 | echo "[!!!]未找到 /etc/cron.d 目录,无法查找系统定时任务" | tee -a "$danger_file" | $Ashro_saveresult 531 | fi 532 | 533 | # 检查 /etc/cron.hourly 目录 534 | if [ -d "/etc/cron.hourly" ]; then 535 | (echo "[!!!]/etc/cron.hourly 定时任务目录存在。") | $Ashro_saveresult 536 | else 537 | echo "[!!!]未找到 /etc/cron.hourly 目录" | tee -a "$danger_file" | $Ashro_saveresult 538 | fi 539 | 540 | # 检查 /etc/cron.daily 目录 541 | if [ -d "/etc/cron.daily" ]; then 542 | (echo "[!!!]/etc/cron.daily 定时任务目录存在。") | $Ashro_saveresult 543 | else 544 | echo "[!!!]未找到 /etc/cron.daily 目录" | tee -a "$danger_file" | $Ashro_saveresult 545 | fi 546 | 547 | # 检查 /etc/cron.weekly 目录 548 | if [ -d "/etc/cron.weekly" ]; then 549 | (echo "[!!!]/etc/cron.weekly 定时任务目录存在。") | $Ashro_saveresult 550 | else 551 | echo "[!!!]未找到 /etc/cron.weekly 目录" | tee -a "$danger_file" | $Ashro_saveresult 552 | fi 553 | 554 | # 检查 /etc/cron.monthly 目录 555 | if [ -d "/etc/cron.monthly" ]; then 556 | (echo "[!!!]/etc/cron.monthly 定时任务目录存在。") | $Ashro_saveresult 557 | else 558 | echo "[!!!]未找到 /etc/cron.monthly 目录" | tee -a "$danger_file" | $Ashro_saveresult 559 | fi 560 | 561 | printf "\n" | $Ashro_saveresult 562 | 563 | 564 | echo "------------查看可疑用户定时任务-------------------" | $Ashro_saveresult 565 | echo "正在分析可疑用户定时任务....." | $Ashro_saverult 566 | danger_crontab=$(crontab -l 2>/dev/null | egrep "((chmod|useradd|groupadd|chattr|wget|curl|su|sudo|rsync).*\.(sh|pl|py|bash|ksh|csh|zsh)))") 567 | if [ -n "$danger_crontab" ]; then 568 | (echo "[!!!]发现可疑定时任务,请注意!!!" && echo "$danger_crontab") | tee -a "$danger_file" | $Ashro_saveresult 569 | else 570 | echo "[*]未发现可疑定时任务" | $Ashro_saverult 571 | fi 572 | printf "\n" | $Ashro_saverult 573 | 574 | echo "------------最近24小时内变动的文件---------------------" | $Ashro_saveresult 575 | 576 | changed_files=$(find / -type f -mtime 0 2>/dev/null | grep -E "\.(py|sh|per|pl|php|asp|jsp)$") 577 | if [ -n "$changed_files" ]; then 578 | echo "最近24小时内发现以下文件有改变:" | $Ashro_saverult 579 | echo "$changed_files" | tee -a "$danger_file" | $Ashro_saverult 580 | else 581 | echo "未发现最近24小时内有改变的文件" | $Ashro_saveresult 582 | fi 583 | printf "\n" | $Ashro_saveresult 584 | 585 | echo "------------CPU分析-----------------" | $Ashro_saveresult 586 | echo "------------CPU情况-----------------" | $Ashro_saveresult 587 | echo "正在检查CPU相关信息....." | $Ashro_saveresult 588 | (echo "CPU硬件信息如下:" && cat /proc/cpuinfo ) | $Ashro_saveresult 589 | (echo "CPU使用情况如下:" && ps -aux --sort=-%cpu | awk 'NR<=5 {print $1,$2,$3,$NF}') | $Ashro_saveresult 590 | printf "\n" | $Ashro_saveresult 591 | echo "------------占用CPU前5进程-----------------" | $Ashro_saveresult 592 | echo "正在检查占用CPU前5资源的进程....." | $Ashro_saveresult 593 | (echo "占用CPU资源前5进程:" && ps -aux --sort=-%cpu | head -6 | tail -n +2) | $Ashro_saveresult 594 | printf "\n" | $Ashro_saveresult 595 | echo "------------占用CPU较大进程-----------------" | $Ashro_saveresult 596 | echo "正在检查占用CPU较大的进程....." | $Ashro_saveresult 597 | pscpu=$(ps -aux --sort=-%cpu | awk '{if($3>=20) print $0}' | tail -n +2) 598 | if [ -n "$pscpu" ];then 599 | echo "[!!!]以下进程占用的CPU超过20%:" && echo "UID PID PPID C STIME TTY TIME CMD" 600 | echo "$pscpu" | tee -a 20.2.3_pscpu.txt | tee -a "$danger_file" | $Ashro_saveresult 601 | else 602 | echo "[*]未发现进程占用资源超过20%" | $Ashro_saveresult 603 | fi 604 | printf "\n" | $Ashro_saverult 605 | 606 | 607 | echo "------------日志分析------------------------------" | $Ashro_saveresult 608 | 609 | echo "------------查看日志配置----------------------" | $Ashro_saveresult 610 | echo "正在查看日志配置....." | $Ashro_saveresult 611 | logconf=$(cat /etc/rsyslog.conf 2>/dev/null | grep -vE "^$|^#" | tee /dev/tty) 612 | if [ -n "$logconf" ]; then 613 | echo "[*]日志配置如下:" | $Ashro_saveresult 614 | echo "$logconf" | $Ashro_saveresult 615 | else 616 | echo "[!!!]未发现日志配置文件" | tee -a "$danger_file" | $Ashro_saveresult 617 | fi 618 | printf "\n" | $Ashro_saveresult 619 | 620 | echo "------------日志是否存在----------------------" | $Ashro_saveresult 621 | echo "正在分析日志文件是否存在....." | $Ashro_saveresult 622 | if ls /var/log/* &>/dev/null; then 623 | echo "[*]日志文件存在" | $Ashro_saveresult 624 | else 625 | echo "[!!!]日志文件不存在,请分析是否被清除!" | tee -a "$danger_file" | $Ashro_saveresult 626 | fi 627 | printf "\n" | $Ashro_saveresult 628 | 629 | echo "------------日志审核是否开启-------------------" | $Ashro_saveresult 630 | echo "正在分析日志审核是否开启....." 631 | if systemctl is-active auditd.service &>/dev/null; then 632 | echo "[*]系统日志审核功能已开启,符合要求" | $Ashro_saveresult 633 | else 634 | echo "[!!!]系统日志审核功能已关闭,不符合要求。建议开启日志审核。可使用以下命令开启:systemctl start auditd.service" | tee -a "$danger_file" | $Ashro_saveresult 635 | fi 636 | printf "\n" | $Ashro_saveresult 637 | 638 | echo "------------打包日志-------------------" | $Ashro_saveresult 639 | echo "正在打包日志......" | $Ashro_saveresult 640 | 641 | # 检查不同的 Linux 发行版,使用相应的打包命令,并将输出重定向到 /dev/null 642 | if command -v zip &>/dev/null; then 643 | # 如果 zip 命令可用,则使用 zip 进行打包,并将输出重定向到 /dev/null 644 | zip -r "${log_dir}system_log.zip" /var/log/ &>/dev/null 645 | if [ $? -eq 0 ]; then 646 | echo "[*]日志打包成功" | $Ashro_saveresult 647 | else 648 | echo "[!!!]日志打包失败,请导出日志" | tee -a "$danger_file" | $Ashro_saveresult 649 | fi 650 | elif command -v tar &>/dev/null; then 651 | # 如果 zip 命令不可用,尝试使用 tar 命令进行打包,并将输出重定向到 /dev/null 652 | tar -czf "${log_dir}system_log.tar.gz" /var/log/ &>/dev/null 653 | if [ $? -eq 0 ]; then 654 | echo "[*]日志打包成功" | $Ashro_saveresult 655 | else 656 | echo "[!!!]日志打包失败,请导出日志" | tee -a "$danger_file" | $Ashro_saveresult 657 | fi 658 | else 659 | # 如果 zip 和 tar 命令都不可用,提示用户手动导出日志 660 | echo "[!!!]找不到适合的打包工具,请手动导出日志" | tee -a "$danger_file" > /dev/null 661 | fi 662 | 663 | 664 | echo "------------secure 日志分析-------------------" | $Ashro_saveresult 665 | echo "------------成功登录-------------------" | $Ashro_saveresult 666 | echo "正在检查日志中成功登录的情况....." | $Ashro_saveresult 667 | loginsuccess=$(grep "Accepted password" /var/log/secure* 2>/dev/null | awk '{print $1,$2,$3,$9,$11}') 668 | if [ -n "$loginsuccess" ]; then 669 | echo "[*]日志中分析到以下用户成功登录:" | tee -a "$danger_file" | $Ashro_saveresult 670 | echo "$loginsuccess" | $Ashro_saveresult 671 | echo "[*]登录成功的IP及次数如下:" | tee -a "$danger_file" | $Ashro_saveresult 672 | grep "Accepted " /var/log/secure* | awk '{print $11}' | sort | uniq -c 673 | echo "[*]登录成功的用户及次数如下:" | tee -a "$danger_file" | $Ashro_saveresult 674 | grep "Accepted" /var/log/secure* | awk '{print $9}' | sort | uniq -c 675 | else 676 | echo "[*]日志中未发现成功登录的情况" | $Ashro_saveresult 677 | fi 678 | printf "\n" | $Ashro_saveresult 679 | 680 | echo "------------登录失败-------------------" | $Ashro_saveresult 681 | echo "正在检查日志中登录失败的情况....." | $Ashro_saveresult 682 | loginfailed=$(grep "Failed password" /var/log/secure* 2>/dev/null | awk '{print $1,$2,$3,$9,$11}') 683 | if [ -n "$loginfailed" ]; then 684 | echo "[!!!]日志中发现以下登录失败的情况:" | tee -a "$danger_file" | $Ashro_saveresult 685 | echo "$loginfailed" | tee -a "$danger_file" | $Ashro_saveresult 686 | echo "[!!!]登录失败的IP及次数如下:" | tee -a "$danger_file" | $Ashro_saveresult 687 | grep "Failed password" /var/log/secure* | awk '{print $11}' | sort | uniq -c 688 | echo "[!!!]登录失败的用户及次数如下:" | tee -a "$danger_file" | $Ashro_saveresult 689 | grep "Failed password" /var/log/secure* | awk '{print $9}' | sort | uniq -c 690 | else 691 | echo "[*]日志中未发现登录失败的情况" | $Ashro_saveresult 692 | fi 693 | printf "\n" | $Ashro_saveresult 694 | 695 | echo "-----------本机登录情况-----------------" | $Ashro_saveresult 696 | echo "正在检查本机登录情况....." | $Ashro_saveresult 697 | secure_log=$(find /var/log/ -type f \( -name "secure" -o -name "auth.log" -o -name "messages" \) 2>/dev/null | head -n1) 698 | if [ -n "$secure_log" ]; then 699 | systemlogin=$(awk '/sshd:session.*session opened/ {print $1,$2,$3,$11}' "$secure_log") 700 | if [ -n "$systemlogin" ]; then 701 | echo "[*]本机登录情况:" | $Ashro_saveresult 702 | echo "$systemlogin" | $Ashro_saveresult 703 | echo "[*]本机登录账号及次数如下:" | $Ashro_saveresult 704 | awk '/sshd:session.*session opened/ {print $11}' "$secure_log" | sort -nr | uniq -c 705 | else 706 | echo "[!!!]未发现在本机登录退出情况,请注意!!!" | $Ashro_saveresult 707 | fi 708 | else 709 | echo "[!!!]未找到安全日志文件,请注意!!!" | tee -a "$danger_file" | $Ashro_saveresult 710 | fi 711 | printf "\n" | $Ashro_saveresult 712 | 713 | 714 | echo "------------新增用户组-----------------" | $Ashro_saveresult 715 | echo "正在检查新增用户组....." | $Ashro_saveresult 716 | 717 | # 检查新增用户组 718 | newgroup_log="" 719 | if [ -f "/var/log/secure" ]; then 720 | newgroup_log="/var/log/secure" 721 | elif [ -f "/var/log/auth.log" ]; then 722 | newgroup_log="/var/log/auth.log" 723 | elif [ -f "/var/log/messages" ]; then 724 | newgroup_log="/var/log/messages" 725 | fi 726 | 727 | if [ -n "$newgroup_log" ]; then 728 | newgroup=$(awk '/new group/ {print $1,$2,$3,$9}' "$newgroup_log") 729 | 730 | if [ -n "$newgroup" ]; then 731 | echo "[!!!]日志中发现新增用户组:" | tee -a "$danger_file" | $Ashro_saveresult 732 | echo "$newgroup" | tee -a "$danger_file" | $Ashro_saveresult 733 | (echo "[*]新增用户组及次数如下:" && awk '/new group/ {print $8}' "$newgroup_log" | awk -F '[=,]' '{print $2}' | sort | uniq -c) | tee -a "$danger_file" | $Ashro_saveresult 734 | else 735 | echo "[*]日志中未发现新增加用户组" | $Ashro_saveresult 736 | fi 737 | fi 738 | 739 | printf "\n" | $Ashro_saverult 740 | 741 | 742 | echo "------------message日志分析---------------" | $Ashro_saveresult 743 | echo "------------传输文件--------------------" | $Ashro_saveresult 744 | echo "正在检查传输文件....." | $Ashro_saveresult 745 | zmodem=$(grep "ZMODEM:.*BPS" /var/log/message*) 746 | if [ -n "$zmodem" ]; then 747 | (echo "[!!!]传输文件情况:" && echo "$zmodem") | tee -a $danger_file | $Ashro_saveresult 748 | else 749 | echo "[*]日志中未发现传输文件" | $Ashro_saveresult 750 | fi 751 | printf "\n" | $Ashro_saveresult 752 | 753 | 754 | echo "-----------cron日志分析---------------" | $Ashro_saveresult 755 | 756 | echo "------------定时下载-----------------" | $Ashro_saveresult 757 | echo "正在分析定时下载....." 758 | cron_download=$(grep "wget\|curl" /var/log/cron /var/log/cron.* 2>/dev/null) 759 | if [ -n "$cron_download" ]; then 760 | (echo "[!!!]定时下载情况:" && echo "$cron_download") | tee -a "$danger_file" | $save_result_command 761 | else 762 | echo "[*]未发现定时下载情况" | $Ashro_saveresult 763 | fi 764 | printf "\n" | $Ashro_saveresult 765 | 766 | 767 | echo "------------定时执行脚本-----------------" | $Ashro_saveresult 768 | echo "正在分析定时执行脚本....." | $Ashro_saveresult 769 | cron_shell=$(grep -E "\.py$|\.sh$|\.pl$" /var/log/cron* 2>/dev/null) 770 | if [ -n "$cron_shell" ]; then 771 | (echo "[!!!]发现定时执行脚本:" && echo "$cron_shell") | tee -a "$danger_file" | $Ashro_saveresult 772 | else 773 | echo "[*]未发现定时执行脚本" | $Ashro_saveresult 774 | fi 775 | printf "\n" | $Ashro_saveresult 776 | 777 | echo "------------btmp日志分析----------------------" | $Ashro_saveresult 778 | echo "------------错误登录日志分析-----------------" | $Ashro_saveresult 779 | echo "正在分析错误登录日志....." | $Ashro_saveresult 780 | lastb=$(lastb 2>/dev/null) 781 | if [ -n "$lastb" ]; then 782 | (echo "[*]错误登录日志如下:" && echo "$lastb") | tee -a "$danger_file" | $Ashro_saveresult 783 | else 784 | echo "[*]未发现错误登录日志" | $Ashro_saveresult 785 | fi 786 | printf "\n" | $Ashro_saveresult 787 | 788 | echo "------------lastlog日志分析----------------------" | $Ashro_saveresult 789 | echo "------------所有用户最后一次登录日志分析-----------------" | $Ashro_saveresult 790 | echo "正在分析所有用户最后一次登录日志....." | $Ashro_saveresult 791 | lastlog=$(lastlog 2>/dev/null) 792 | if [ -n "$lastlog" ]; then 793 | (echo "[*]所有用户最后一次登录日志如下:" && echo "${lastlog}") | tee -a "$danger_file" | $Ashro_saveresult 794 | else 795 | echo "[*]未发现所有用户最后一次登录日志" | $Ashro_saveresult 796 | fi 797 | printf "\n" | $Ashro_saveresult 798 | 799 | echo "------------wtmp日志分析----------------------" | $Ashro_saveresult 800 | echo "------------所有登录用户分析-----------------" | $Ashro_saveresult 801 | echo "正在检查历史上登录到本机的用户:" | $Ashro_saveresult 802 | lasts=$(last | grep pts | grep -vw :0 2>/dev/null) 803 | if [ -n "$lasts" ]; then 804 | (echo "[*]历史上登录到本机的用户如下:" && echo "$lasts") | $Ashro_saveresult 805 | else 806 | echo "[*]未发现历史上登录到本机的用户信息" | $Ashro_saveresult 807 | fi 808 | printf "\n" | $Ashro_saveresult 809 | 810 | echo "------------sshd配置文件-------------------" | $Ashro_saveresult 811 | echo "------------sshd配置-------------------" | $Ashro_saveresult 812 | echo "正在检查sshd配置....." | $Ashro_saveresult 813 | sshdconfig=$(grep -vE "^$|^#" /etc/ssh/sshd_config 2>/dev/null) 814 | if [ -n "$sshdconfig" ]; then 815 | (echo "[*]sshd配置文件如下:" && echo "$sshdconfig") | $Ashro_saveresult 816 | else 817 | echo "[!]未发现sshd配置文件" | $Ashro_saveresult 818 | fi 819 | printf "\n" | $Ashro_saveresult 820 | 821 | 822 | # Alias 后门检测 823 | echo "正在检测 Alias 后门..." | tee -a "$danger_file" | $Ashro_saveresult 824 | 825 | # 列出当前用户的别名并搜索其中是否包含可疑命令 826 | if [ -f ~/.bashrc ]; then 827 | echo "检查 ~/.bashrc..." | tee -a "$danger_file" | $Ashro_saveresult 828 | grep -E 'alias[[:space:]]+(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' ~/.bashrc | tee -a "$danger_file" | $Ashro_saveresult 829 | fi 830 | 831 | if [ -f ~/.bash_profile ]; then 832 | echo "检查 ~/.bash_profile..." | tee -a "$danger_file" | $Ashro_saveresult 833 | grep -E 'alias[[:space:]]+(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' ~/.bash_profile | tee -a "$danger_file" | $Ashro_saveresult 834 | fi 835 | 836 | if [ -f ~/.profile ]; then 837 | echo "检查 ~/.profile..." | tee -a "$danger_file" | $Ashro_saveresult 838 | grep -E 'alias[[:space:]]+(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' ~/.profile | tee -a "$danger_file" | $Ashro_saveresult 839 | fi 840 | 841 | # SSH 后门检测 842 | echo "正在检测 SSH 后门..." | tee -a "$danger_file" | $Ashro_saveresult 843 | 844 | # 检查 SSH 配置文件是否包含可疑命令 845 | if [ -f ~/.ssh/config ]; then 846 | echo "检查 ~/.ssh/config..." | tee -a "$danger_file" | $Ashro_saveresult 847 | grep -E '(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' ~/.ssh/config | tee -a "$danger_file" | $Ashro_saveresult 848 | fi 849 | 850 | # SSH Wrapper 后门检测 851 | echo "正在检测 SSH Wrapper 后门..." | tee -a "$danger_file" | $Ashro_saveresult 852 | 853 | # 检查 SSH 授权密钥文件是否包含可疑命令 854 | if [ -f ~/.ssh/authorized_keys ]; then 855 | echo "检查 ~/.ssh/authorized_keys..." | tee -a "$danger_file" | $Ashro_saveresult 856 | grep -E 'command="(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' ~/.ssh/authorized_keys | tee -a "$danger_file" | $Ashro_saveresult 857 | fi 858 | 859 | 860 | # 检查特定目录中是否存在可疑文件 861 | if [ -d /var/tmp ]; then 862 | echo "检查 /var/tmp..." | tee -a "$danger_file" | $Ashro_saveresult 863 | ls -la /var/tmp | grep -E '(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' | tee -a "$danger_file" | $Ashro_saveresult 864 | fi 865 | 866 | # 检查系统日志中是否包含可疑内容 867 | echo "检查系统日志..." | $Ashro_saveresult 868 | if [ -f /var/log/auth.log ]; then 869 | grep -E '(wget|curl|bash|sh|nc|netcat|python|perl|php|ruby|java|gcc|g\+\+)' /var/log/auth.log | tee -a "$danger_file" | $Ashro_saveresult 870 | fi 871 | 872 | # 检查是否安装并配置了 iptables 873 | if command -v iptables &> /dev/null; then 874 | echo "检测到 iptables 防火墙" | $Ashro_saveresult 875 | echo "正在检查是否存在 any 到 any 的策略..." | $Ashro_saveresult 876 | 877 | # 检查是否存在 any 到 any 的策略 878 | if iptables -L | grep -q 'Chain INPUT (policy ACCEPT)' && \ 879 | iptables -L | grep -q 'Chain FORWARD (policy ACCEPT)' && \ 880 | iptables -L | grep -q 'Chain OUTPUT (policy ACCEPT)'; then 881 | echo "未发现 any 到 any 的策略" | $Ashro_saveresult 882 | else 883 | echo "iptables警告:检测到 any 到 any 的策略" | tee -a "$danger_file" | $Ashro_saveresult 884 | fi 885 | 886 | echo "显示最近修改的 5 条规则:" 887 | iptables -L --line-numbers | head -n 6 | tee -a "$danger_file" | $Ashro_saveresult 888 | 889 | # 检查是否安装并配置了 ufw 890 | elif command -v ufw &> /dev/null; then 891 | echo "检测到 ufw 防火墙" | $Ashro_saveresult 892 | echo "正在检查是否存在 any 到 any 的策略..." | $Ashro_saveresult 893 | 894 | # 检查是否存在 any 到 any 的策略 895 | if ufw status | grep -q 'Anywhere'; then 896 | echo "警告:ufw检测到 any 到 any 的策略" | tee -a "$danger_file" | $Ashro_saveresult 897 | else 898 | echo "未发现 any 到 any 的策略" | $Ashro_saveresult 899 | fi 900 | 901 | echo "显示最近修改的 5 条规则:" | tee -a "$danger_file" | $Ashro_saveresult 902 | ufw status numbered | head -n 6| tee -a "$danger_file" | $Ashro_saveresult 903 | 904 | # 检查是否安装并配置了 firewalld 905 | elif command -v firewalld &> /dev/null; then 906 | echo "检测到 firewalld 防火墙" | $Ashro_saveresult 907 | echo "正在检查是否存在 any 到 any 的策略..." | $Ashro_saveresult 908 | 909 | # 检查是否存在 any 到 any 的策略 910 | if firewall-cmd --list-all | grep -q 'rule family="ipv4" source address="0.0.0.0/0"'; then 911 | echo "警告:firewall检测到 any 到 any 的策略" | tee -a "$danger_file" | $Ashro_saveresult 912 | else 913 | echo "未发现 any 到 any 的策略" | $Ashro_saveresult 914 | fi 915 | 916 | echo "显示最近修改的 5 条规则:" 917 | firewall-cmd --list-all | grep -Po 'rule.*' | head -n 5 918 | 919 | # 检查是否安装并配置了 nftables 920 | elif command -v nft &> /dev/null; then 921 | echo "检测到 nftables 防火墙"| $Ashro_saveresult 922 | echo "正在检查是否存在 any 到 any 的策略..."| $Ashro_saveresult 923 | 924 | # 检查是否存在 any 到 any 的策略 925 | if nft list ruleset | grep -q 'ip saddr 0.0.0.0/0'; then 926 | echo "警告:nftables检测到 any 到 any 的策略"| tee -a "$danger_file" | $Ashro_saveresult 927 | else 928 | echo "未发现 any 到 any 的策略"| $Ashro_saveresult 929 | fi 930 | 931 | echo "显示最近修改的 5 条规则:"| tee -a "$danger_file" | $Ashro_saveresult 932 | nft list ruleset | head -n 6| tee -a "$danger_file" | $Ashro_saveresult 933 | 934 | # 如果没有安装支持的防火墙 935 | else 936 | echo "未检测到支持的防火墙"| tee -a "$danger_file" | $Ashro_saveresult 937 | fi 938 | 939 | echo "检查结束!!!" | $Ashro_saveresult 940 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

个人感觉,手敲还是挺好的


3 | 4 | 感谢 https://www.yuque.com/beicheni/ 北辰老板的资料分享 5 | 6 | Linux通用应急响应脚本,适用大多数情况 7 | 8 | 目前在ubuntu、centos7、kali上均可以正常运行。其他未实验 可以提供报错,针对修改。 9 | 10 | 脚本执行后生成的文件解释: 11 | danger_file.txt 脚本执行后的高危结果,对付看,结果需要经验分析,不要一股脑就认为风险项。 12 | 13 | danger_file 14 | 15 | 16 | 17 | check_file文件夹--检查命令篡改 18 | weibu_md5.py 通过脚本获取系统上的命令配置文件的MD5值到check_file/*.csv文件中,进行微步的威胁情报查询,需要配置脚本中的自己api。脚本执行后会在当前目录生成结果文件。是否命令篡改结果一目了然。 19 | 20 | weibu_md5 21 | 22 | 23 | webshell文件夹--检查可执行文件后门 24 | 执行脚本后会将当前系统中正在进行的进程其涉及到的可执行文件cp下来。dump下来沙箱检测即可。 25 | 26 | log文件夹--会将/var/log/*文件夹内容打包成压缩包 27 | Ashro_checkresult.txt 结尾的是脚本执行过程日志,这个比较友好可以从这里分析 28 | 29 | image 30 | 31 | 32 | 详细功能介绍:
33 | 1.必须root权限运行
34 | 2.收集IP地址信息
35 | 3.查看正在登录的用户
36 | 4.查看/etc/passwd
37 | 5.检查是否存在超级用户
38 | 6.空口令账户检测
39 | 7.新增用户检查
40 | 8.新增用户组检查
41 | 9.检测sudoers文件中的用户权限
42 | 10.使用 visudo 命令查找具有 NOPASSWD 权限的用户
43 | 11.检查各账户下是否存在ssh登录公钥
44 | 12.账户密码文件权限检测
45 | 13.暴力破解攻击检测
46 | 14.查询正在监听的端口
47 | 15.检查建立的网络连接
48 | 16.检查是否存在系统进程
49 | 17.检测存在那些守护进程
50 | 18.CPU和内存使用率最高的进程排查(超过20%)
51 | 19.检查是否存在隐藏进程
52 | 20.检查反弹shell类进程
53 | 21.将进程对应的可执行文件保存到指定目录--webshell--沙箱检测
54 | 22.系统命令hash值打包---威胁情报MD5对比
55 | 23.检查正在运行的服务
56 | 24.检查系统文件的权限变更(一周内)
57 | 25.收集历史命令
58 | 26.用户自定义启动项排查
59 | 27.系统自启动项排查
60 | 28.危险启动项排查
61 | 29.系统定时任务分析
62 | 30.用户定时任务分析
63 | 31.检查最近24小时内有改变的文件(误报会很多)
64 | 32.cpu情况分析(占用前5)
65 | 33.日志分析
66 | 34.日志审核是否开启
67 | 35.打包日志(/var/log/*)全打包
68 | 36.secure日志分析(登录成功。登录失败,新增用户组)
69 | 37.message日志分析(传输文件情况)
70 | 38.cron日志分析(定时下载、定时执行)
71 | 39.btmp日志分析(错误登录日志)
72 | 40.lastlog日志分析(最后一次登录日志)
73 | 41.wtmp日志分析(历史登录本机用户)
74 | 42.Alias 后门检测
75 | 43.SSH 后门检测
76 | 44.SSH Wrapper 后门检测
77 | 45.检查 SSH 授权密钥文件是否包含可疑命令
78 | 46.检查特定目录中是否存在可疑文件
79 | 47.检查系统日志中是否包含可疑内容
80 | 48.防火墙配置检测
81 | 82 | 83 | windows应急响应工具地
84 | https://github.com/FindAllTeam/FindAll/ 85 | 86 | 87 | 感谢 theLSA 老哥提到的debian系统出现的定时任务出现找不到文件情况。目前已解决 2024.06.24 88 | 89 | 90 | 91 | 92 | 补充一个应急小tip
93 | 当漏扫工具被截留到服务器上时候,还定位不到攻击者遗留的工具时,
94 | 例如ips上出现横向攻击10.16.5.134 时,可以执行如下命令。 他会查找全系统文件内容中的可能存在漏洞结果的文件位置。
95 | find / -type f -exec grep -l "10.16.5.134" {} \\;
96 | ![image](https://github.com/user-attachments/assets/6178f2c8-6853-4636-b3e8-7731b03aec26) 97 | 98 | -------------------------------------------------------------------------------- /weibu_md5.py 已经不能用了,被搞收费了: -------------------------------------------------------------------------------- 1 | import requests 2 | import csv 3 | import random # 导入random模块 4 | 5 | # 列出多个API密钥 6 | API_KEYS = [ 7 | '填写自己微步api 最好多几个', 8 | '', 9 | '', 10 | '', 11 | '', 12 | '', 13 | '' 14 | ] 15 | 16 | # 随机选择一个API密钥 17 | def get_random_api_key(): 18 | return random.choice(API_KEYS) 19 | 20 | # 全局变量,API参数 21 | API_URL = 'https://api.threatbook.cn/v3/file/report' 22 | SANDBOX_TYPE = 'win7_sp1_enx86_office2013' 23 | 24 | # 调用微步API获取MD5信息函数 25 | def get_md5_info(md5_value): 26 | api_key = get_random_api_key() # 随机选择一个API密钥 27 | params = { 28 | 'apikey': api_key, 29 | 'sandbox_type': SANDBOX_TYPE, 30 | 'md5': md5_value 31 | } 32 | list_data = [] 33 | try: 34 | response = requests.get(API_URL, params=params) 35 | response_json = response.json() 36 | print(response_json) 37 | 38 | if response_json['response_code'] == 0: 39 | # 解析API响应 40 | data = response_json['data']['summary'] #概括 41 | multi_engines = "'"+ data['multi_engines'] #检测引擎数 42 | is_whitelist = data['is_whitelist'] #是否白名单 43 | malware_type = data['malware_type'] #恶意软件类型 44 | malware_family = data['malware_family'] #恶意软件家族 45 | threat_level = data['threat_level'] #告警等级 suspicious(可疑的) malicious(恶意的) clean(干净的) 46 | list_datas = multi_engines, is_whitelist, malware_type, malware_family, threat_level 47 | list_data.extend(list_datas) 48 | 49 | return list_data 50 | else: 51 | return None 52 | except Exception as e: 53 | print(f'MD5获取错误:{str(e)}') 54 | return None 55 | 56 | # 读取CSV文件 57 | with open('command_hashes.csv', 'r', encoding="GBK",newline='') as f: 58 | reader = csv.reader(f) 59 | rows = list(reader) 60 | # 添加列标题到CSV数据的末尾的单独列中 61 | for row in rows[1:]: # 跳过第一行,从第二行开始 62 | md5_value = row[1] # 获取第三列数据 63 | if md5_value: 64 | result = get_md5_info(md5_value) # 获取MD5信息 65 | if result is not None: 66 | row.extend(result) 67 | 68 | 69 | # 70 | # 更新后的数据保存 71 | with open('command_hashes_update.csv', 'w', newline='', encoding='utf-8-sig') as f: 72 | writer = csv.writer(f) 73 | writer.writerow(['文件名','MD5','检测引擎数', '是否白名单', '恶意软件类型', '恶意软件家族','告警等级']) 74 | for row in rows[1:]: # 写入处理过的所有行 75 | writer.writerow(row) 76 | print(row) 77 | 78 | print("CSV文件已成功更新.") 79 | -------------------------------------------------------------------------------- /事件记录: -------------------------------------------------------------------------------- 1 | 1.打印机疯狂打印事件: 2 | 描述:某一天办公网打印机疯狂吐纸,经排查为AWVS漏洞扫描的时候扫到了打印机的IP 导致疯狂吐纸。 3 | 解决:重启打印机、升级打印机版本,漏扫时将打印机设置为白名单 4 | 5 | 2.挖矿木马事件 6 | 描述: 7 | -------------------------------------------------------------------------------- /常用手敲命令快速盘点-持续更新: -------------------------------------------------------------------------------- 1 | #用户方向 2 | # 定位哪些用户登录 3 | who 4 | # 查看哪些IP破解你SSH密码以及次数 5 | cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2" = "$1;}' 6 | # 登录失败的记录 7 | grep -o "Failed password" /var/log/secure|uniq -c 8 | # 登录成功的记录 9 | grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 10 | #查看可疑IP登陆 11 | last -f /var/log/wtmp 12 | # 登录日志中检测是否遭受暴力破解攻击 13 | grep -i 'failed' /var/log/auth.log* | grep -E 'password|authentication failure' | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | while read count ip; do if [ "$count" -ge 5 ]; then echo "[!!!] IP $ip 可能正在进行暴力破解攻击,共有 $count 次失败尝试。"; fi; done 14 | # 判断存在哪些用户 15 | cat /etc/passwd 16 | cat /etc/shadow 17 | # 新增用户检查 18 | awk -F: '$3 >= 1000 && $3 != 65534' /etc/passwd 19 | #.用户最后登录日志 20 | last 21 | # 遍历所有用户的家目录,如果 .ssh/authorized_keys 文件存在,就会输出警告信息并打印该文件的内容。 22 | getent passwd | cut -d: -f6 | xargs -I {} sh -c 'if [ -f "{}/.ssh/authorized_keys" ]; then echo "[!!!] 在用户 {} 下发现登录公钥:" && cat "{}/.ssh/authorized_keys"; fi' 23 | # 查看历史命令 24 | cat /root/.bash_history 25 | history 26 | 27 | 28 | #===网络连接与进程 29 | #查看当前CPU使用情况 30 | top 31 | # 查看系统当前建立的网络连接 32 | netstat -tun | grep ESTABLISHED 33 | netstat -anptl 34 | # 查看系统当前正在监听的端口 35 | netstat -tuln | awk 'NR > 2 {print $4}' | awk -F':' '{print $NF}' | sort -nu 36 | # 列出正在监听端口的详细信息 37 | lsof -i :$port | awk 'NR==1 || /LISTEN/' #需要更改$port 38 | #查看网络连接及运行程序 39 | ss -nlpt 40 | # 查询所有监听端口的网络连接是否存在反弹shell类进程 41 | netstat -tuln | grep -E "nc -l -p|netcat|ncat|socat|shell|bind|reverse|listen|connect|exec|sh|bash|zsh|ksh|telnet|ssh|rsh|rcp|sshpass|pexpect|paramiko|plink|pscp|putty|ssh-keygen|ssh-agent|tsh|rbash|dash|mkfifo|expect|bash -c|python -c|perl -e|curl|wget|php -r|lua -e|bash -i|php -a|python -m|perl -M|ruby -e|perl -n|python -p|ruby -n|bash -s|php -l|wget -O|curl -o 42 | # 查看系统进程 43 | ps -aux 44 | #当查看进程时,发现进程存在,但是没有进程文件以及进程id时,可以查看/etc/*.so文件,判断是不是进行了动态链接库隐藏, 45 | ls -la /etc/*.so 46 | # 查看CPU使用率最高的进程 47 | ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 5 48 | # 查找后台进程 49 | ps aux | grep -E '^\S+ +[0-9]+ +[0-9]+ .+\/.*' 50 | # 查找内存使用率最高的进程 51 | ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%mem | head -n 5 52 | #隐藏进程查看 53 | cat /proc/PID/mountinfo | grep proc //隐藏进程查看 54 | #进入sudo su root 权限,umount /proc/pid 55 | #另一种方法 56 | ps -ef| awk '{print}' |sort -n|uniq >1 57 | ls /proc |sort -n|uniq >2 58 | diff 1 2 59 | 60 | #查看运行目录 61 | pwdx PID 62 | #查看运行进程原文件 63 | find / -name <进程名> 64 | #进程运行时间 65 | ps -eo pid,lstart.etime,cmd|grep pid 66 | #查看访问时间、创建时间 67 | stat filepath 68 | #查看进程 69 | ps -ef 70 | # 查看上述进程文件调用情况 71 | lsof -p PID 72 | #结束进程 73 | kill -9 PID 74 | #结束进程组 75 | kill -9 PGID 76 | 77 | #====文件变更 78 | # find 常用语法 79 | #find / -mtime -n +n //-n是n天内 +n指n天前修改文件 80 | #find / -name "*.xls" //查找指定文件 81 | #find . -type f |grep -i \.*filename //在当前目录及其子目录中查找包含指定文件名(不区分大小写)的文件 82 | # 查找7天内具有执行权限的普通文件,并输出文件名和修改日期 83 | find / -type f -mtime -7 -executable 84 | # 指定目录下2天内新增的文件 85 | find /tmp -ctime -2 86 | # 指定目录下1天内修改的文件 87 | find /home/ -type f -mtime -1 //指定目录下1天内修改的文件 88 | # 指定日期修改的文件 89 | find /home/ -type f -newermt 2022-03-22 90 | # 查找指定日期内存在变动的文件 91 | ind / -type f -newermt "2024-12-03" ! -newermt "2024-12-07" 2>/dev/nul | grep -E "\.(py|sh|per|pl|php|asp|jsp|txt)$" 92 | # 寻找当前目录下文件内容中是否存在base64加密 93 | find . -type f -exec grep -l "base64 -d|bash" {} \; 94 | find . -type f -exec grep -l "base64_decode" {} \; 95 | # 当漏扫工具被截留到服务器上时候,还定位不到攻击者遗留的工具时,例如ips上出现横向攻击10.16.5.134 时,可以执行如下命令。 他会查找全系统文件内容中的可能存在漏洞结果的文件位置。 96 | find / -type f -exec grep -l "10.16.5.134" {} \; 97 | 98 | 99 | 100 | 101 | #===后门类型 102 | #.查找系统定时任务 103 | grep -v "# run-parts" /etc/crontab 2>/dev/null | grep run-parts 104 | cat /etc/crontab 105 | ls /etc/cron* #查看所有计划任务 106 | crontab -l #windows 自启动目录 107 | crontab -e //进入删除计划任务配置 108 | lsattr -a /var/spool/cron/ #查看任务权限 109 | chattr -a /var/spool/cron/ #修改任务读写权限 110 | lsatter filename #查看文件属性 111 | chattr -i filename #移除i属性来删除文件 112 | journalctl -unit app |grep key #查看指定服务日志 113 | service warm status #排查服务运行情况 114 | service warm stop #停止服务命令 115 | systemctl status PID #查看服务关联进程 116 | macro.Melissa suspicious #宏病毒恶意代码特征 117 | 118 | 定时任务保存位置 119 | var/spool/cron/* 120 | /var/spool/anacron/* 121 | /etc/crontab 122 | /etc/anacrontab 123 | /etc/cron.* 124 | /etc/anacrontab 125 | /etc/cron.d 126 | /etc/cron.daily 127 | /etc/cron.hourly 128 | /etc/cron.monthly 129 | /etc/rc.d/init.d/ 130 | 131 | 132 | 2.启动项排查 133 | cat /etc/init.d/rc.local 查看init.d文件夹下的rc.local文件内容 134 | cat /etc/rc.local 135 | ls -alt /etc/init.d 136 | 137 | 3.映像劫持检查: 138 | lsmod | grep -v "^Module" 查看是否加载可疑模块 139 | ps aux | less 查看是否开启非系统进程 140 | 141 | 142 | 其他日志分析 143 | /var/log/message //包括整体系统信息 144 | /var/log/auth.log //包含系统授权信息,包括用户登录和使用的权限机制等 145 | /var/log/userlog //记录所有等级用户信息的日志 146 | /var/log/cron //记录crontab命令是否被正确的执行 147 | /var/log/xferlog(vsftpd.log) //记录Linux FTP日志 148 | /var/log/lastlog //记录登录的用户,可以使用命令lastlog查看 149 | /var/log/secure //记录大多数应用输入的账号与密码,登录成功与否 150 | /var/log/wtmp //记录登录系统成功的账户信息,等同于命令last 151 | /var/log/faillog //记录登录系统不成功的账号信息,一般会被黑客删除 如果开启了一些服务,也需要对服务运行的日志进行排查 152 | cat /var/log/boot.log //查看所有进程启动和停止相关的日志信息 153 | vim /var/log/maillog //查看邮件相关的日志信息 154 | cat /var/log/spooler //查看新闻群组方面相关的日志信息 155 | cat /var/log/dmesg //查看Linux操作系统在引导过程中的各种事件信息 156 | 157 | 158 | 159 | 内存马排查 160 | 161 | #jsp框架,日志中排查可疑jsp的访问请求。 162 | 如果是代码执行漏洞,排查中间件的error.log,查看是否有可以的报错,判断注入时间和方法。 163 | 根据业务使用的组件排查是否可能存在java代码执行漏洞以及是否存在webshell,排查框架漏洞,反序列化漏洞。 164 | 如果是servlet或者spring的controller类型,根据上报的webshell的url查找日志(日志可能被关闭,不一定有,根据url最早访问时间确定被注入时间) 165 | 如果是filter或者listener类型,可能会有较多的404但是带有参数的请求,或者大量请求不同url但带有相同的参数,或者页面不存在但返回200. 166 | 167 | tomcat-memshell-scanner.jsp 168 | 169 | 170 | windwos 171 | 172 | netstat -ano 检查端口连接情况,是否有远程连接、可疑连接 173 | tasklist | findstr "PID"根据pid定位进程 174 | msconfig看一下启动项是否有可以的启动 175 | %UserProfile%\Recent 最近访问的文件夹 176 | netstat -ano //网络连接 177 | tasklist |findstr PID //通过PID查看进程 178 | msconfig //服务项 179 | tasklist /svc //进程 180 | resmon cpu //使用情况 181 | compmgmt.msc //计算机-管理 计划任务,日志查询 182 | eventvwr.msc 事件查看器 183 | lusrmgr.msc //用户与组 184 | services.msc //服务 185 | net user //获取用户列表 186 | net session //查看当前会话 187 | net use //远程连接 188 | net share //查看当前用户的共享目录 189 | net start //查看当前运行的服务 190 | net localgroup administrators //本机管理员 191 | certutil -hashfile 文件名 MD5 //获取md5值命令 192 | ncpa.cpl //打开网络连接 193 | wmic process where Name=”cmd.exe” get ParentProcessId //查看对应父进程 194 | wmic process get caption,commandline /value >> tmp.txt //分析进程参数 195 | wmic process where caption="svchost.exe" get caption,commandline /value //分析指定进程命令行参数 196 | #windows 自启动目录 197 | C:\Users\用户名\AppData\Roaming\Microsoft\Windows\start Menu\Programs\Startup 198 | C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 199 | 200 | 201 | 202 | 203 | 204 | 数据库 205 | 206 | 207 | 具体的位置和寻找方式因为数据库软件和操作系统的版本不同而异,以下是一些常用数据库和操作系统的日志和配置文件位置: 208 | 1. MySQL:MySQL 的日志文件通常位于 /var/log/mysql/ 目录下,可以通过 mysqladmin 工具查看。MySQL 的配置文件为 my.cnf,通常位于 /etc/mysql/ 或 /etc/ 目录下。 209 | 2. Oracle:Oracle 的日志文件名称和位置取决于其日志配置的设置,可以通过 Log File Viewer 查看。Oracle 的配置文件为 init.ora 或 spfile.ora,通常位于 $ORACLE_HOME/dbs/ 目录下。 210 | 3. SQL Server:SQL Server 的日志文件位于 SQL Server 的数据目录中,例如 C:\Program Files\Microsoft SQL Server\MSSQL10_50.\MSSQL\Log 目录下。SQL Server 的配置文件为 SQL Server Configuration Manager,可以在 SQL Server Configuration Manager 中查看。 211 | 4. PostgreSQL:PostgreSQL 的日志文件位于 /var/log/postgresql/ 目录下,可以使用 pgAdmin 管理工具查看。PostgreSQL 的配置文件为 postgresql.conf,通常位于 /etc/postgres/ 或 /usr/local/pgsql/data/ 目录下。 212 | 5. Linux 系统:Linux 系统的日志文件通常位于 /var/log/ 目录下,如 /var/log/auth.log、/var/log/syslog 等。Linux 系统的配置文件通常位于 /etc/ 目录下,如 /etc/passwd、/etc/group 等。 213 | 214 | 215 | --------------------------------------------------------------------------------