转载
深度解析CentOS通过日志反查入侵
昨天晚上群里有一个朋友的服务器发现有入侵的痕迹后来处理解决但是由于对方把日志都清理了无疑给排查工作增加了许多难度。刚好手里有些资料我就整理整理贴出来分享一下。其实日志的作用是非常大的。学会使用通过日志来排查解决我们工作中遇到的一些问题是很有必要的。下面就一一道来。 大纲 Linux日志系统简介 Linux日志分析 Linux日志入侵发现 实例分析 Linux日志系统简介 日志的主要用途是系统审计、监测追踪和分析统计。 为了保证 Linux 系统正常运行、准确解决遇到的各种各样的系统问题认真地读取日志文件是管理员的一项非常重要的任务。 UNIX/ Linux采用了syslog工具来实现此功能如果配置正确的话所有在主机上发生的事情都会被记录下来不管是好的还是坏的。 什么是 syslog Linux 内核由很多子系统组成包括网络、文件访问、内存管理等。子系统需要给用户传送一些消息这些消息内容包括消息的来源及其重要性等。所有的子系统都要把消息送到一个可以维护的公用消息区于是就有了 syslog。 syslog 是一个综合的日志记录系统。它的主要功能是方便日志管理和分类存放日志。 syslog 使程序设计者从繁重的、机械的编写日志文件代码的工作中解脱出来使管理员更好地控制日志的记录过程。 syslog 能设置成根据输出信息的程序或重要程度将信息排序到不同的文件。例如由于核心信息更重要且需要有规律地阅读以确定问题出在哪里所以要把核心信息与其他信息分开来单独定向到一个分离的文件中。 管理员可以通过编辑 /etc/syslog.conf 来配置它们的行为。 syslogd的配置文件 syslogd 的配置文件 /etc/syslog.conf 规定了系统中需要监视的事件和相应的日志的保存位置。 # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # 将 info 或更高级别的消息送到 /var/log/messages # 除了 mail/news/authpriv/cron 以外。 # 其中*是通配符代表任何设备none 表示不对任何级别的信息进行记录。 *.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages # 将 authpirv 设备的任何级别的信息记录到 /var/log/secure 文件中 # 这主要是一些和认证、权限使用相关的信息。 authpriv.* /var/log/secure # 将 mail 设备中的任何级别的信息记录到 /var/log/maillog 文件中这主要是和电子邮件相关的信息。 mail.* -/var/log/maillog # 将 cron 设备中的任何级别的信息记录到 /var/log/cron 文件中 # 这主要是和系统中定期执行的任务相关的信息。 cron.* /var/log/cron # 将任何设备的 emerg 级别或更高级别的消息发送给所有正在系统上的用户。 *.emerg * # 将 uucp 和 news 设备的 crit 级别或更高级别的消息记录到 /var/log/spooler 文件中。 uucp,news.crit /var/log/spooler # 将和本地系统启动相关的信息记录到 /var/log/boot.log 文件中。 local7.* /var/log/boot.log # 将 news 设备的 crit 级别的消息记录到 /var/log/news/news.crit 文件中。 news.=crit /var/log/news/news.crit # 将 news 设备的 err 级别的消息记录到 /var/log/news/news.err 文件中。 news.=err /var/log/news/news.err # 将 news 设备的 notice 或更高级别的消息记录到 /var/log/news/news.notice 文件中。 news.notice syslogd配置设备级别动作 级别字段 动作字段 常见的日志文件
日志系统主要分为三类 系统接入日志: 多个程序会记录该日志记录到/var/log/wtmp和/var/run/utmp文件中telnet、ssh等程序会更新wtmp和utmp文件系统管理员可以根据该日志跟踪到谁在何时登录到系统。 进程统计日志: linux内核记录该日志当一个进程终止时进程统计文件pacct或acct中会进行记录。进程统计日志可以供系统管理员分析系统使用者对系统进行的配置以及对文件进行的操作。 错误日志: Syslog日志系统已经被许多设备兼容Linux的syslog可以记录系统事件主要由syslogd程序执行Linux系统下各种进程、用户程序和内核都可以通过Syslog文件记录重要信息错误日志记录在/var/log/messages中。有许多Linux/Unix程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。
常用的日志文件解析 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件就是Linux系统开机自检过程显示的信息。 /var/log/cron 该日志文件记录crontab守护进程crond所派生的子进程的动作前面加上用户、登录时间和PID以及派生出的进程的动作。CMD的一个动作是cron派生出一个调度进程的常见情况。REPLACE替换动作记录用户对它的cron文件的更新该文件列出了要周期性执行的任务调度。 RELOAD动作在REPLACE动作后不久发生这意味着cron注意到一个用户的cron文件被更新而cron需要把它重新装入内存。该文件可能会查到一些反常的情况。 /var/log/maillog 该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。 QUOTE: Sep 4 17:23:52 UNIX sendmail[1950]: g849Npp01950: from=root, size=25, class=0, nrcpts=1, msgid=<200209040923.g849Npp01950@redhat.pfcc.com.cn>, relay=root@localhost Sep 4 17:23:55 UNIX sendmail[1950]: g849Npp01950: to=lzy@fcceec.net, ctladdr=root (0/0), delay=00:00:04, xdelay=00:00:03, mailer=esmtp, pri=30025, relay=fcceec.net. [10.152.8.2], dsn=2.0.0, stat=Sent (Message queued) /var/log/messages
该日志文件是许多进程日志文件的汇总从该文件可以看出任何入侵企图或成功的入侵。如以下几行 QUOTE: Sep 3 08:30:17 UNIX login[1275]: FAILED LOGIN 2 FROM (null) FOR suying, Authentication failure Sep 4 17:40:28 UNIX -- suying[2017]: LOGINON pts/1 BY suying FROM fcceec.www.ec8.pfcc.com.cn Sep 4 17:40:39 UNIX su(pam_unix)[2048]: session opened for user root by suying(uid=999) /var/log/syslog 默认RedHat Linux不生成该日志文件但可以配置/etc/syslog.conf让系统生成该日志文件。它和/etc/log/messages日志文件不同它只记录警告信息常常是系统出问题的信息所以更应该关注该文件。要让系统生成该日志文件在/etc/syslog.conf文件中加上*.warning /var/log/syslog 该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息。下面是一条记录 QUOTE: Sep 6 16:47:52 UNIX login(pam_unix)[2384]: check pass; user unknown /var/log/secure 该日志文件记录与安全相关的信息。该日志文件的部分内容如下 QUOTE: Sep 4 16:05:09 UNIX xinetd[711]: START: ftp pid=1815 from=127.0.0.1 Sep 4 16:05:09 UNIX xinetd[1815]: USERID: ftp OTHER :root Sep 4 16:07:24 UNIX xinetd[711]: EXIT: ftp pid=1815 duration=135(sec) Sep 4 16:10:05 UNIX xinetd[711]: START: ftp pid=1846 from=127.0.0.1 Sep 4 16:10:05 UNIX xinetd[1846]: USERID: ftp OTHER :root Sep 4 16:16:26 UNIX xinetd[711]: EXIT: ftp pid=1846 duration=381(sec) Sep 4 17:40:20 UNIX xinetd[711]: START: telnet pid=2016 from=10.152.8.2 /var/log/lastlog 该日志文件记录最近成功登录的事件和最后一次不成功的登录事件由login生成。在每次用户登录时被查询该文件是二进制文件需要使用 lastlog命令查看根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过就显示为"**Never logged in**"。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似如下的信息 QUOTE: UsernamePort From Latest root tty2 Tue Sep 3 08:32:27 +0800 2002 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** 系统账户诸如bin、daemon、adm、uucp、mail等决不应该登录如果发现这些账户已经登录就说明系统可能已经被入侵了。若发现记录的时间不是用户上次登录的时间则说明该用户的账户已经泄密了。 /var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加该文件的大小也会越来越大增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录last命令就通过访问这个文件获得这些信息并以反序从后向前显示用户的登录记录last也能根据用户、终端 tty或时间显示相应的记录。 命令last有两个可选参数 last -u 用户名显示用户上次登录的情况。 last -t 天数显示指定天数之前的用户登录情况。 /var/run/utmp 该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化它只保留当时联机的用户记录不会为用户保留永久的记录。系统中需要查询当前用户状态的程序如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息因为某些突发错误会终止用户登录会话而系统没有及时更新 utmp记录因此该日志文件的记录不是百分之百值得信赖的。 以上提及的3个文件/var/log/wtmp、/var/run/utmp、/var/log/lastlog是日志子系统的关键文件都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的故不能用less、cat之类的命令直接查看这些文件而是需要使用相关命令通过这些文件而查看。 每次有一个用户登录时login程序在文件lastlog中查看用户的UID。如果存在则把用户上次登录、注销时间和主机名写到标准输出中然后 login程序在lastlog中记录新的登录时间打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。utmp文件被各种命令使用包括who、w、users和finger。 下一步login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。 /var/log/xferlog 该日志文件记录FTP会话可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序以及该用户拷贝了哪些文件供他使用。 该文件的格式为第一个域是日期和时间第二个域是下载文件所花费的秒数、远程系统名称、文件大小、本地路径名、传输类型aASCIIb二进制、与压缩相关的标志或tar或"_"如果没有压缩的话、传输方向相对于服务器而言i代表进o代表出、访问模式a匿名g输入口令r真实用户、用户名、服务名通常是ftp、认证方法lRFC931或0认证用户的ID或"*"。下面是该文件的一条记录 QUOTE: Wed Sep 4 08:14:03 2002 1 UNIX 275531 /var/ftp/lib/libnss_files-2.2.2.so b _ o a -root@UNIX ftp 0 * c /var/log/Xfree86.x.log 该日志文件记录了X-Window启动的情况。 另外除了/var/log/外恶意用户也可能在别的地方留下痕迹应该注意以下几个地方root 和其他账户的shell历史文件用户的各种邮箱如.sent、mbox以及存放在/var/spool/mail/ 和/var/spool/mqueue中的邮箱临时文件/tmp、/usr/tmp、/var/tmp隐藏的目录其他恶意用户创建的文件通常是以 "."开头的具有隐藏属性的文件等。 /var/log/kernlog RedHat Linux默认没有记录该日志文件。要启用该日志文件必须在/etc/syslog.conf文件中添加一行kern.* /var/log/kernlog 。这样就启用了向/var/log/kernlog文件中记录所有内核消息的功能。该文件记录了系统启动时加载设备或使用设备的情况。一般是正常的操作但如果记录了没有授权的用户进行的这些操作就要注意因为有可能这就是恶意用户的行为。下面是该文件的部分内容 QUOTE: Sep 5 09:38:42 UNIX kernel: NET4: Linux TCP/IP 1.0 for NET4.0 Sep 5 09:38:42 UNIX kernel: IP Protocols: ICMP, UDP, TCP, IGMP
Sep 5 09:38:42 UNIX kernel: IP: routing cache hash table of 512 buckets, 4Kbytes
查看日志文件 绝大多数日志文件是纯文本文件每一行就是一个消息。只要是在Linux下能够处理纯文本的工具都能用来查看日志文件。可以使用 cat、tac、more、less、tail 和 grep 进行查看。 日志文件的格式 下面以 /var/log/messages 为例说明其日志文件的格式。该文件中每一行表示一个消息而且都由四个域的固定格式组成 时间标签(Timestamp)表示消息发出的日期和时间。 主机名(Hostname)表示生成消息的计算机的名字。 生成消息的子系统的名字可以是“Kernel”表示消息来自内核或者是进程的名字表示发出消息的程序的名字。在方括号里的是进程的PID。 消息(Message)即消息的内容。 # syslog 发出的消息说明了守护进程已经在 Dec 1603:32:41 重新启动了。 Dec 16 03:32:41 cnetos5 syslogd 1.4.1: restart. # 在 Dec 1900:20:56 启动了内核日志 klogd Dec 19 00:20:56 cnetos5 kernel: klogd 1.4.1, log source = /proc/kmsg started. # 在 Dec 1900:21:01 启动了xinetd Dec 19 00:21:01 cnetos5 xinetd[2418]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
实际上在 /var/log/message 文件中的消息都不是特别重要或紧急的 查看非文本格式日志文件 一些日志文件是二进制文件需要使用相应的命令进行读取 lastlog 使用 lastlog 命令来检查某特定用户上次登录的时间并格式化输出上次登录日志 /var/log/lastlog 的内容。例如 Linux系统中记录用户登入登出情况的文件是wtmp文件记录当前登录用户情况的文件是utmp文件它们是Linux系统安全的重要文件。这两个文件中所有的日志都记录了准确的时间。 Utmp以及wtmp文件都是二进制文件不能通过tailcatvi或者重定向进行编辑。系统管理员需要通过命令获取这两个文件中包含的信息其中utmp文件中包含的信息可以通过who、w、users和finger获取 wtmp文件中包含的信息可以通过last和ac获取。 last last 命令往回搜索 /var/log/wtmp 来显示自从文件第一次创建以来登录过的用户 lastb lastb 命令搜索 /var/log/btmp 来显示登录未成功的信息。例如 who who 命令查询 wtmp 文件并报告当前登录的每个用户。who 命令的缺省输出包括用户名、终端类型、登录日期及远程主机。例如 who 通过该命令系统管理员可以发现当前系统存在哪些不法用户找到非法使用用户后可以通过多种手段限制该用户或者该登录IP继续使用服务器。 在指明wtmp情况下通过who命令可以查询到所有以前的记录。下面是命令who /var/log/wtmp的运行结果显示了自从wtmp文件创建、删改以来的每一次登录。 [root@ntbak ~]# who /var/log/wtmp ntbackup pts/0 2011-06-03 14:18 (10.35.8.242) root pts/3 2011-06-03 15:24 (10.35.117.80) root pts/3 2011-06-03 15:48 (10.35.117.80) ntbackup pts/0 2011-06-03 17:15 (10.35.8.242) ntbackup pts/0 2011-06-07 10:15 (10.35.117.73) ntbackup pts/3 2011-06-07 10:26 (10.35.117.73) ntbackup pts/0 2011-06-07 10:45 (10.35.117.73) ntbackup pts/4 2011-06-07 12:43 (10.35.117.73) ntbackup pts/5 2011-06-07 13:41 (10.35.117.73) ntbackup pts/0 2011-06-07 15:41 (10.35.117.73) root pts/0 2011-06-07 21:12 (10.32.171.146) ntbackup pts/0 2011-06-08 10:39 (10.35.117.73) ntbackup pts/0 2011-06-09 19:43 (10.35.117.73) ntbackup pts/0 2011-06-10 08:24 (10.35.117.73) ntbackup pts/3 2011-06-10 08:34 (10.35.117.73) ntbackup pts/4 2011-06-10 10:25 (10.35.117.73) ntbackup pts/0 2011-06-10 12:34 (10.35.117.73) ntbackup pts/0 2011-06-13 08:34 (10.35.117.73) root pts/0 2011-06-13 15:42 (flashieldsdell.nt.jsNaNcc) root pts/0 2011-06-14 14:44 (10.35.117.80) root pts/0 2011-06-14 19:06 (10.35.117.80)
用于入侵检测日志 需要检查的系统日志文件主要包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时要特别注意时间记载分析日志产生的时间是否合理。 可疑的日志记录 非正常时间凌晨的用户登录; 关键日志记录损坏尤其是记录用户登录登出信息的wtmp文件; 非正常IP的用户登录; 用户登录失败甚至一再尝试登录并失败的日志记录; 非正常的超级用户权限切换su指令; 非正常的控制进程启动或重启记录。 检查步骤 users命令在一行打印出当前登录的用户信息每个用户名代表对应一个登录会话。结合who命令以及进程统计日志可以分析黑客伪造这两个命令的情况。运行该命令将如下所示: root@ntbak ~]# users root root root [root@ntbak ~]# who root tty1 2011-03-21 16:59 root pts/0 2011-06-14 19:06 (10.35.117.80) root pts/2 2011-03-13 14:21 (:1.0) last命令与who /var/log/wtmp命令输出结果相似。通过使用以及对比着两个输出系统管理员可以对使用系统的用户进行审计和考核及时发现问题解决问题。运行该命令如下所示: [root@ntbak ~]# last root pts/0 10.35.117.80 Tue Jun 14 19:06 still logged in root pts/0 flashieldsdell.n Mon Jun 13 15:42 - 19:21 (03:38) ntbackup pts/0 10.35.117.73 Mon Jun 13 08:34 - 09:11 (00:37) …… ntbackup pts/0 10.35.8.242 Fri Jun 3 14:18 - 16:29 (02:11) 如果使用上述命令显示的信息太多比较难区分可以通过grep命令或者对last命令指明用户来显示其登录信息即可。例如: 只显示root的历史登录信息则如下所示: [root@ntbak ~]# last root root pts/0 10.35.117.80 Tue Jun 14 19:06 still logged in root pts/0 10.35.117.80 Tue Jun 14 14:44 - 16:58 (02:14) root pts/0 flashieldsdell.n Mon Jun 13 15:42 - 19:21 (03:38) root pts/0 10.32.171.146 Tue Jun 7 21:12 - 23:24 (02:11) root pts/3 10.35.117.80 Fri Jun 3 15:48 - 18:04 (02:16) root pts/3 10.35.117.80 Fri Jun 3 15:24 - 15:24 (00:00) ac命令根据系统的wtmp文件中的登入登出信息生成用户连接时间单位小时的报告如下所示 [root@ntbak ~]# ac –d //ac -d命令,然后按回车键,将显示每天的总的连接时间 Jun 3 total 6.68 Jun 7 total 18.89 Jun 8 total 9.92 Jun 9 total 11.00 Jun 10 total 9.28 Jun 13 total 4.26 Today total 2.84 [root@ntbak ~]# ac –p //ac -p命令,然后按回车键,将显示每个用户的总的连接时间 ntbackup 51.92 root 10.95 total 62.87 lastlog命令通过格式化输出上次登录日志/var/log/lastlog的内容可以显示用户上次登录的时间。它可以显示登录用户名、登录使用方式tty/pts和上次登录时间。如果一个用户从未登录过则显示“**Never logged**”。。运行该命令如下所示: [root@working]# lastlog UsernamePort From Latest root pts/1 10.0.2.129 二 5月 10 10:13:26 +0800 2005 opal pts/1 10.0.2.129 二 5月 10 10:13:26 +0800 2005 Linux入侵案列分析 ps一下发现有几个异常的程序如下图一所示有一个sendmail程序还有一个异常的SCREEN程序。 用netstat –an看一下发现比较奇怪的端口1985还有一个/dev/gpmctl的数据流以前是没有过的 来到/var/log目录下看一下secure日志 从10月9号上午11:01:22开始一直到10月10号的凌晨03:37:33期间不断有用户对机器进行ssh的野蛮滥用而且从日志中可以看到进行弱口令账号测试的不是一台机器而是来自几台不同的机器 140.123.230.*(台湾) 211.173.47.* (韩国) 164.164.149.* (印度) 210.118.26.* 韩国 217.199.173.* 英国 218.5.117.* 福建泉州 211.90.95.* 江苏联通 用last日志看一下过去的登陆记录如下图四显示可以看出从域名floman2.mediasat登陆用nslookup查询竟然找不到这个域名。 再看看wtmp日志用who wtmp看到如下图五的日志这里显示的域名是floman2.mediasat.ro用nslookup可以查到域名服务器是位于罗马尼亚dns服务器ip为193.231.170.*。 我们来定位一下在图一中发现的sendmail程序的来源发现sendmail是位于/etc/log.d/scripts/service目录下应该就是sendmail脚本就用来转发所谓的垃圾邮件。只需将这些脚本删除就可以解决发送垃圾邮件的问题。但是服务器中有其它异常的进程被别人hacking了这个解决起来就困难多了。 再来定位一下图一中异常的screen程序用命令 Locate screen来定位输出如下图所示看来有很多文件要查啊。从图中可以看出“.screen”以.开始的目录这应该是一个隐藏的目录。 来到/home/upload目录用ls命令看不到果真是隐藏了。隐藏也没有关系可以直接进入.screen目录。 用ls la 发现有很多为0字节的文件如下图十二所示类型以p开头的这是管道文件管道是linux下的一个重要概念传统的文件是把一个程序的输出经过暂存文件转换成另一个程序的输入而管道的作用是把一个程序的输出接到另一个程序的输入而不经过任何中间文件。管道的特性也决定了我们不能够看到这里文件的内容。 进入到/home/upload中的文件名为空的隐藏目录发现其中有2个子目录如下图十所示。 进入到scan目录里面的内容如下图十一所示其中go.sh和s是脚本 目录scan里的程序实现对局域网内开放某个端口的机器扫描并保存扫描结果目录mech里是一个bot程序当运行里面的bash程序时会自动连接到IRC聊天室。 在启动文件中我们发现一个异常的程序 本来以为删除了启动脚本中的异常程序以及upload中的隐藏文件夹’‘和’.screen’和/etc/log.d这个目录就行了后来在检查日志messages的时候发现一个异常如下图。 发现一个uid0的bone用户uid0不是管理员用户吗我们到/etc/passwd中发现果真是存在一个root用户bone,如图十五所示说明入侵者已经取得了系统的最高权限。将其删除。 因为机器中存在sendmail的脚本故有邮件存在目录为/var/spool/mail经查看发现存在如下的几个文件都是为空。删除这个目录Rm –rf mail注意到/etc/passwd存在一个mail用户将这个删除。 通过调查分析和日志取证找出异常程序和入侵帐户。从我们后面的分析日志中分析得出系统被入侵的原因是因为存在一个存在密码为passwd的弱口令帐号入侵者通过探测到这个弱口令帐户远程登陆到系统并且利用一些方法提高了权限最后得到了管理员root权限。
其实在服务器部署完后安全工作我们也要做的非常到位,避免留过多的隐患给有坏心眼的人。之前我有发表过一遍安全部署方面的帖子,链接是:http://ks0101.blog.51cto.com/8639108/1365721有兴趣可以看看,会起到很大作用的。 |