放射科小黄 發表於 2019-8-6 19:11:00

如何检查linux服务器是否被入侵

<h1 class="postTitle"><strong>被入侵服务器的症状</strong></h1>
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body">
<p>当服务器被没有经验攻击者或者自动攻击程序入侵了的话,他们往往会消耗 100% 的资源。他们可能消耗 CPU 资源来进行数字货币的采矿或者发送垃圾邮件,也可能消耗带宽来发动 DoS 攻击。</p>
<p>因此出现问题的第一个表现就是服务器 “变慢了”。这可能表现在网站的页面打开的很慢,或者电子邮件要花很长时间才能发送出去。</p>
<p>那么你应该查看那些东西呢?</p>
<p><strong>检查 1 - 当前都有谁在登录?</strong></p>
<p>你首先要查看当前都有谁登录在服务器上。发现攻击者登录到服务器上进行操作并不复杂。</p>
<p>其对应的命令是 w。运行 w 会输出如下结果:</p>
<ol class="dp-sql">
<li class="alt">&nbsp;08:32:55&nbsp;up&nbsp;98&nbsp;days,&nbsp;&nbsp;5:43,&nbsp;&nbsp;2&nbsp;users,&nbsp;&nbsp;<span class="keyword">load&nbsp;average:&nbsp;0.05,&nbsp;0.03,&nbsp;0.00&nbsp;</span></li>
<li><span class="func">USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TTY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">FROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGIN@&nbsp;&nbsp;&nbsp;IDLE&nbsp;&nbsp;&nbsp;JCPU&nbsp;&nbsp;&nbsp;PCPU&nbsp;WHAT&nbsp;</span></span></li>
<li class="alt">root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/0&nbsp;&nbsp;&nbsp;&nbsp;113.174.161.1&nbsp;&nbsp;&nbsp;&nbsp;08:26&nbsp;&nbsp;&nbsp;&nbsp;0.00s&nbsp;&nbsp;0.03s&nbsp;&nbsp;0.02s&nbsp;ssh&nbsp;root@coopeaa12&nbsp;</li>
<li>root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/1&nbsp;&nbsp;&nbsp;&nbsp;78.31.109.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;08:26&nbsp;&nbsp;&nbsp;&nbsp;0.00s&nbsp;&nbsp;0.01s&nbsp;&nbsp;0.00s&nbsp;w&nbsp;</li>
</ol>
<p>第一个 IP 是英国 IP,而第二个 IP 是越南 IP。这个不是个好兆头。</p>
<p>停下来做个深呼吸, 不要恐慌之下只是干掉他们的 SSH 连接。除非你能够防止他们再次进入服务器,否则他们会很快进来并踢掉你,以防你再次回去。</p>
<p>请参阅本文最后的“被入侵之后怎么办”这一章节来看找到了被入侵的证据后应该怎么办。</p>
<p>whois 命令可以接一个 IP 地址然后告诉你该 IP 所注册的组织的所有信息,当然就包括所在国家的信息。</p>
<p><strong>检查 2 - 谁曾经登录过?</strong></p>
<p>Linux 服务器会记录下哪些用户,从哪个 IP,在什么时候登录的以及登录了多长时间这些信息。使用 last 命令可以查看这些信息。</p>
<p>输出类似这样:</p>
<ol class="dp-sql">
<li class="alt">root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;78.31.109.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thu&nbsp;Nov&nbsp;30&nbsp;08:26&nbsp;&nbsp;&nbsp;still&nbsp;logged&nbsp;<span class="op">in&nbsp;</span></li>
<li>&nbsp;</li>
<li class="alt">root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;113.174.161.1&nbsp;&nbsp;&nbsp;&nbsp;Thu&nbsp;Nov&nbsp;30&nbsp;08:26&nbsp;&nbsp;&nbsp;still&nbsp;logged&nbsp;<span class="op">in&nbsp;</span></li>
<li>&nbsp;</li>
<li class="alt">root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;78.31.109.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thu&nbsp;Nov&nbsp;30&nbsp;08:24&nbsp;-&nbsp;08:26&nbsp;&nbsp;(00:01)&nbsp;</li>
<li>&nbsp;</li>
<li class="alt">root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;113.174.161.1&nbsp;&nbsp;&nbsp;&nbsp;Wed&nbsp;Nov&nbsp;29&nbsp;12:34&nbsp;-&nbsp;12:52&nbsp;&nbsp;(00:18)&nbsp;</li>
<li>&nbsp;</li>
<li class="alt">root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14.176.196.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mon&nbsp;Nov&nbsp;27&nbsp;13:32&nbsp;-&nbsp;13:53&nbsp;&nbsp;(00:21)&nbsp;</li>
</ol>
<p>这里可以看到英国 IP 和越南 IP 交替出现,而且最上面两个 IP 现在还处于登录状态。如果你看到任何未经授权的 IP,那么请参阅最后章节。</p>
<p>登录后的历史记录会记录到二进制的 /var/log/wtmp 文件中(LCTT 译注:这里作者应该写错了,根据实际情况修改),因此很容易被删除。通常攻击者会直接把这个文件删掉,以掩盖他们的攻击行为。 因此, 若你运行了 last 命令却只看得见你的当前登录,那么这就是个不妙的信号。</p>
<p>如果没有登录历史的话,请一定小心,继续留意入侵的其他线索。</p>
<p><strong>检查 3 - 回顾命令历史</strong></p>
<p>这个层次的攻击者通常不会注意掩盖命令的历史记录,因此运行 history 命令会显示出他们曾经做过的所有事情。 一定留意有没有用 wget 或 curl 命令来下载类似垃圾邮件机器人或者挖矿程序之类的非常规软件。</p>
<p>命令历史存储在 ~/.bash_history 文件中,因此有些攻击者会删除该文件以掩盖他们的所作所为。跟登录历史一样,若你运行 history 命令却没有输出任何东西那就表示历史文件被删掉了。这也是个不妙的信号,你需要很小心地检查一下服务器了。(LCTT 译注,如果没有命令历史,也有可能是你的配置错误。)</p>
<p><strong>检查 4 - 哪些进程在消耗 CPU?</strong></p>
<p>你常遇到的这类攻击者通常不怎么会去掩盖他们做的事情。他们会运行一些特别消耗 CPU 的进程。这就很容易发现这些进程了。只需要运行 top 然后看最前的那几个进程就行了。</p>
<p>这也能显示出那些未登录进来的攻击者。比如,可能有人在用未受保护的邮件脚本来发送垃圾邮件。</p>
<p>如果你最上面的进程对不了解,那么你可以 Google 一下进程名称,或者通过 losf 和 strace 来看看它做的事情是什么。</p>
<p>使用这些工具,第一步从 top 中拷贝出进程的 PID,然后运行:</p>
<ol class="dp-sql">
<li class="alt">strace&nbsp;-p&nbsp;PID&nbsp;</li>
</ol>
<p>这会显示出该进程调用的所有系统调用。它产生的内容会很多,但这些信息能告诉你这个进程在做什么。</p>
<ol class="dp-sql">
<li class="alt">lsof&nbsp;&nbsp;-p&nbsp;PID&nbsp;</li>
</ol>
<p>这个程序会列出该进程打开的文件。通过查看它访问的文件可以很好的理解它在做的事情。</p>
<p><strong>检查 5 - 检查所有的系统进程</strong></p>
<p>消耗 CPU 不严重的未授权进程可能不会在 top 中显露出来,不过它依然可以通过 ps 列出来。命令 ps auxf 就能显示足够清晰的信息了。</p>
<p>你需要检查一下每个不认识的进程。经常运行 ps (这是个好习惯)能帮助你发现奇怪的进程。</p>
<p><strong>检查 6 - 检查进程的网络使用情况</strong></p>
<p>iftop 的功能类似 top,它会排列显示收发网络数据的进程以及它们的源地址和目的地址。类似 DoS 攻击或垃圾机器人这样的进程很容易显示在列表的最顶端。</p>
<p><strong>检查 7 - 哪些进程在监听网络连接?</strong></p>
<p>通常攻击者会安装一个后门程序专门监听网络端口接受指令。该进程等待期间是不会消耗 CPU 和带宽的,因此也就不容易通过 top 之类的命令发现。</p>
<p>lsof 和 netstat 命令都会列出所有的联网进程。我通常会让它们带上下面这些参数:</p>
<ol class="dp-sql">
<li class="alt">lsof&nbsp;-i&nbsp;</li>
</ol><ol class="dp-sql">
<li class="alt">netstat&nbsp;-plunt&nbsp;</li>
</ol>
<p>你需要留意那些处于 LISTEN 和 ESTABLISHED 状态的进程,这些进程要么正在等待连接(LISTEN),要么已经连接(ESTABLISHED)。如果遇到不认识的进程,使用 strace 和 lsof 来看看它们在做什么东西。</p>
<p><strong>被入侵之后该怎么办呢?</strong></p>
<p>首先,不要紧张,尤其当攻击者正处于登录状态时更不能紧张。你需要在攻击者警觉到你已经发现他之前夺回机器的控制权。如果他发现你已经发觉到他了,那么他可能会锁死你不让你登陆服务器,然后开始毁尸灭迹。</p>
<p>如果你技术不太好那么就直接关机吧。你可以在服务器上运行 shutdown -h now 或者 systemctl poweroff 这两条命令之一。也可以登录主机提供商的控制面板中关闭服务器。关机后,你就可以开始配置防火墙或者咨询一下供应商的意见。</p>
<p>如果你对自己颇有自信,而你的主机提供商也有提供上游防火墙,那么你只需要以此创建并启用下面两条规则就行了:</p>
<ol>
<li>只允许从你的 IP 地址登录 SSH。</li>
<li>封禁除此之外的任何东西,不仅仅是 SSH,还包括任何端口上的任何协议。</li>
</ol>
<p>这样会立即关闭攻击者的 SSH 会话,而只留下你可以访问服务器。</p>
<p>如果你无法访问上游防火墙,那么你就需要在服务器本身创建并启用这些防火墙策略,然后在防火墙规则起效后使用 kill 命令关闭攻击者的 SSH 会话。(LCTT 译注:本地防火墙规则 有可能不会阻止已经建立的 SSH 会话,所以保险起见,你需要手工杀死该会话。)</p>
<p>最后还有一种方法,如果支持的话,就是通过诸如串行控制台之类的带外连接登录服务器,然后通过 systemctl stop network.service 停止网络功能。这会关闭所有服务器上的网络连接,这样你就可以慢慢的配置那些防火墙规则了。</p>
<p>重夺服务器的控制权后,也不要以为就万事大吉了。</p>
<p>不要试着修复这台服务器,然后接着用。你永远不知道攻击者做过什么,因此你也永远无法保证这台服务器还是安全的。</p>
<h3>&nbsp;</h3>
<h3>&nbsp;</h3>
<h3>&nbsp;</h3>
<h3>用户登录相关日志文件:</h3>
<h2>utmp、wtmp、btmp文件</h2>
<p>Linux用户登录信息放在三个文件中:</p>
<p>1  /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记录系统启动时间;</p>
<p>2  /var/log/wtmp:记录当前正在登录和历史登录系统的用户信息,默认由last命令查看;</p>
<p>3  /var/log/btmp:记录失败的登录尝试信息,默认由lastb命令查看。</p>
<p>这三个文件都是二进制数据文件,并且三个文件结构完全相同,是由/usr/include/bits/utmp.h文件定义了这三个文件的结构体。</p>
<p>默认情况下文件的日志信息会通过logrotate日志管理工具定期清理。logrotate的配置文件是/etc/logrotate.conf,此处是logrotate的缺省设置,通常不需要对它进行修改。日志文件的轮循压缩等设置存放在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下,它会覆盖缺省设置。</p>
<p>如果不想记录相关信息,则可以直接将相关文件删除即可。如果系统不存在该文件,则需要在此路径touch一个文件就可以继续记录相关信息了。</p>
<p>此外:</p>
<p>如果想禁用who命令,则只需要将utmp的可读权限去掉就行,这样非root用户就不能用此命令了;如果是btmp文件,手工创建的话注意权限必须为600,否则不能正确写入信息。&nbsp;</p>
<h2>相关命令:</h2>
<p>lastlog、<strong>last</strong>、lastb、ac、<strong>who</strong>、<strong>w</strong>、users、utmpdump。</p>
<p>其中last、lastb、who、utmpdump可以通过指定参数而查看三个中的任意一个文件。</p>
<p>&nbsp;</p>
<h4>2.1 lastlog:</h4>
<p>列出所有用户最近登录的信息,或者指定用户的最近登录信息。lastlog引用的是/var/log/lastlog文件中的信息,包括login-name、port、last login time</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>lzx-clone1:/var/log # lastlog
Username                Port   Latest
root                pts/1    Wed Oct 19 14:37:46 +0800 2016
bin                        **Never logged in**
daemon                     **Never logged in**
gdm                        **Never logged in**
admin                        **Never logged in**
lzx               pts/3    Wed Oct 19 15:15:24 +0800 2016</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<h4>&nbsp;2.2 last</h4>
<p>列出当前和曾经登入系统的用户信息,它默认读取的是/var/log/wtmp文件的信息。输出的内容包括:用户名、终端位置、登录源信息、开始时间、结束时间、持续时间。注意最后一行输出的是wtmp文件起始记录的时间。当然也可以通过last -f参数指定读取文件,可以是/var/log/btmp、/var/run/utmp</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre># last

root   pts/0      10.200.108.92    Tue Oct 18 15:04   still logged in

root   pts/1      10.200.108.92    Wed Oct 12 17:02   still logged in

root   pts/0      10.200.108.92    Wed Oct 12 09:20 - 16:58(07:38)   

root   pts/0      10.200.108.92    Sat Oct8 10:40 - 14:45(04:05)   

root   pts/0      10.200.108.92    Wed Aug 31 10:52 - 08:44(21:52)   

root   pts/0      10.200.108.92    Fri Jul8 13:08 - 09:41 (25+20:32)

reboot   system boot2.6.32-431.el6.x Tue Jan 13 19:40 - 19:44(00:04)


wtmp begins Tue Jan 13 19:40:22 2015 </pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<h4>2.3 lastb</h4>
<p>列出失败尝试的登录信息,和last命令功能完全相同,只不过它默认读取的是/var/log/btmp文件的信息。当然也可以通过last -f参数指定读取文件,可以是/var/log/btmp、/var/run/utmp</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre># lastb

root   ssh:notty    10.200.108.92    Wed Oct 19 17:11 - 17:11(00:00)   

root   ssh:notty    10.200.108.92    Wed Oct 19 17:11 - 17:11(00:00)   

root   ssh:notty    10.200.108.92    Wed Oct 19 17:10 - 17:10(00:00)   

root   ssh:notty    10.200.108.92    Wed Oct 19 17:10 - 17:10(00:00)   


btmp begins Wed Oct 19 17:10:12 2016</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<div class="cnblogs_code">
<pre>lzx-clone1:/var/log # lastb -F -f /var/log/wtmp
root   pts/0      10.200.108.92    Tue Mar8 11:04:36 2016 - Tue Mar8 11:04:36 2016(00:00)   

wtmp begins Tue Mar8 11:04:36 2016</pre>
</div>
<h4>2.4 ac</h4>
<p>输出所有用户总的连接时间,默认单位是小时。由于ac是基于wtmp统计的,所以修改或者删除wtmp文件都会使ac的结果受影响。(Suse默认没有该命令)</p>
<p># ac</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total&nbsp;&nbsp;&nbsp;&nbsp; 7404.62&nbsp;</p>
<h4>&nbsp;2.5 who</h4>
<p>查看当前登入系统的用户信息。其中who -m等效于who am i。</p>
<p>语法who ... [ FILE | ARG1 ARG2 ]。</p>
<p>who命令强大的一点是,它既可以读取utmp文件也可以读取wtmp文件,默认没有指定FILE参数时,who查询的是utmp的内容。当然可以指定FILE参数,比如who -aH /var/log/wtmp,则此时查看的是wtmp文件。</p>
<p>查看当前运行级别</p>
<p># who -rH</p>
<p>名称&nbsp;&nbsp; 线路&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空闲&nbsp; 进程号 备注</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行级别 5 2016-07-08 13:01</p>
<p>查看登录用户和用户数≈users</p>
<p>lzx-clone1:/var/run # who -q</p>
<p>root root root root</p>
<p># users=4</p>
<h4>2.6 w</h4>
<p>查看当前登入系统的用户信息及用户当前的进程(而who命令只能看用户不能看进程)。该命令能查看的信息包括字系统当前时间,系统运行时间,登陆系统用户总数及系统1、5、10分钟内的平均负载信息。后面的信息是用户,终端,登录源,login time,idle time,JCPU,PCPU,当前执行的进程等。</p>
<p>w的信息来自两个文件:用户登录信息来自/var/run/utmp,进程信息来自/proc/.</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<pre>lzx-clone1:/var/log # w
15:26:40 up 12 days, 56 min,4 users,load average: 0.14, 0.16, 0.20
USER   TTY      LOGIN@   IDLE   JCPU   PCPU WHAT
root   :0      10Oct16 ?xdm?43:33   0.69s /usr/bin/gnome-session
root   pts/0   Wed14   40.00s0.19s0.00s w
root   pts/1   Wed14   23:01m0.06s0.06s -bash
root   pts/2   10Oct169days0.01s0.01s /bin/bash -l</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif"></span></div>
</div>
<h4>2.7 users</h4>
<p>显示当前正在登入统的用户名。语法是users ... 。如果未指定FILE参数则默认读取的是/var/run/utmp,当然也可以指定通用相关文件/var/log/wtmp,此时输出的就不是当前用户了。</p>
<p># users</p>
<p>root root</p>
<h4>&nbsp;2.8 utmpdump</h4>
<p>utmpdump用于转储二进制日志文件到文本格式的文件以便查看,同时也可以修改二进制文件!!包括/var/run/utmp、/var/log/wtmp、/var/log/btmp。语法为:utmpdump 。修改文件实际就可以抹除系统记录,所以一定要设置好权限,防止非法入侵。</p>
<p>例子:修改utmp或wtmp。由于这些都是二进制日志文件,你不能像编辑文件一样来编辑它们。取而代之是,你可以将其内容输出成为文本格式,并修改文本输出内容,然后将修改后的内容导入回二进制日志中。如下:&nbsp;</p>
<div class="cnblogs_code">
<pre>utmpdump /var/log/utmp &gt; tmp_output.txt          #导出文件信息

                                                 #&lt;使用文本编辑器修改 tmp_output.txt&gt;

utmpdump -r tmp_output.txt &gt; /var/log/utmp       #导入到源文件中</pre>
</div>
</div>
</div><br><br>
来源:https://www.cnblogs.com/steven9898/p/11311154.html
頁: [1]
查看完整版本: 如何检查linux服务器是否被入侵