linux系统信息审查(Linux Host Review)

0x00 背景在渗透测试和管理主机的时候,了解一台主机的配置情况是很重要的,通过这个镜像文件,我们可以练习很多命令的使用,动手做一遍比看一百遍要强的多。帐号为user,密码是live,可以使用ssh登录或者直接在虚拟机里练习。可以通过sudo -s获得root权限。镜像下载地址:linux_host_review_i386.iso?32位linux_host_review.iso?64位PDF文档 linux_host_review.pdf0x01 记录在查看配置的时候,做一些记录是非常必要的,也是一个很好的习惯。我们可以先切换到/tmp目录,然后使用screen创建一个新的screen会话,再按Ctrl+a,接着按H,即可开启记录,屏幕下方应该会提示:

Creating logfile "screenlog.0"

当完成查看的时候,再次按下Ctrl+a,接着按H,即可关系记录,屏幕下方应该会提示:

logfile "screenlog.0" closed.

PS:关于screen命令的使用,可以看看查看 http://www.ibm.com/developerworks/cn/linux/l-cn-screen/0x02 查看系统信息1.查看发行版版本号,因为在这里我们用的是Debian,所以使用:

cat /etc/debian_version

其他发行版可以使用:

RedHat系列 cat /etc/redhat-releaseFedora     cat /etc/fedora-releaseUbuntu     lsb_release -a

2.内核版本

# uname -aLinux debian 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux

通过内核版本信息,我们可以查找它是否可以有利用的exp(比如在这里下载:http://pan.baidu.com/share/link?uk=1041092847&shareid=16068&fid=1516854499)。也可以使用uptime来猜测Kernel是否打上补丁。

# uptime21:14:58 up 70 days, 6:20, 21 users, load average: 0.74, 0.51, 0.58

这里我们看到系统已经运行了70天,内核很可能没有在这个期间打上补丁。0x03 时间管理确保系统与NTP服务器同步非常重要,因为所有与时间有关的操作都依赖于时间。比如:

× 日志管理× SSL认证× 基于时间的认证

下面,我们查看ntp服务是否在运行。

# ps -edf | grep ntpntp 1397 1 0 02:21 ? 00:00:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 102:104

还要确认可以正确访问ntp服务器。

# ntpq -p -nremote refid st t when poll reach delay offset jitter==============================================================================-121.0.0.41 204.152.184.72 2 u 250 1024 377 54.635 -2.797 0.877 +203.26.72.7 202.147.104.51 3 u 393 1024 377 58.965 -0.952 9.207 *130.102.128.23 130.102.132.164 2 u 495 1024 377 59.171 0.984 2.292+208.87.107.28 206.246.122.250 2 u 461 1024 377 272.890 1.948 1.136

可以看到NTP正常连接。0x04 Package安装情况我们可以找到有漏洞的程序,并加以利用。

# dpkg -l | lessDesired=Unknown/Install/Remove/Purge/Hold| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)||/ Name Version Description+++-===================================-============================-===================================================================ii adduser 3.112+nmu2 add and remove users and groupsii apache2 2.2.16-6+squeeze7 Apache HTTP Server metapackageii apache2-mpm-prefork 2.2.16-6+squeeze7 Apache HTTP Server - traditional non-threaded modelii apache2-utils 2.2.16-6+squeeze7 utility programs for webserversii apache2.2-bin 2.2.16-6+squeeze7 Apache HTTP Server common binary files[ ... ]

0x05 日志我们还需要查看系统的日志是如何处理的,在这个镜像中,我们发现它使用rsyslog。

# ps -edf | grep syslogroot 1305 1 0 Aug06 ? 00:00:00 /usr/sbin/rsyslogd -c4

rsyslog的配置文件存储在/etc/rsyslog.conf。通过查看配置文件我们发现rsyslog并没有在记录日志。

# provides UDP syslog reception#$ModLoad imudp#$UDPServerRun 514# provides TCP syslog reception#$ModLoad imtcp#$InputTCPServerRun 514

0x06 网络情况1.一般信息

ifconfig -a                             查看所有网络接口的信息route -n                                查看系统的路由表,如未安装route命令,可以使用netstat -rn代替cat /etc/resolv.conf或者cat /etc/hosts  查看DNS配置

2.防火墙规则我们使用iptables查看防火墙信息。详见(http://linux.vbird.org/linux_server/0250simple_firewall.php)

# iptables -L -vChain INPUT (policy DROP 2 packets, 1152 bytes)pkts bytes target prot opt in out source destination40 3696 ACCEPT all -- lo any anywhere anywhere86 7401 ACCEPT tcp -- eth0 any anywhere anywheretcp dpt:ssh0 0 ACCEPT tcp -- eth0 any anywhere anywhere tcpdpt:www29 4818 ACCEPT all -- any any anywhere anywherestate RELATED,ESTABLISHEDChain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 16 packets, 1135 bytes)pkts bytes target prot opt in out source destination

我们可以看到,80(HTTP)、22(SSH)和其他已知端口(系统自己启动的)的进出是允许的。同时,出口流量没有设置防火墙规则。通常情况下,应该为系统配置出口流量的防火墙规则,限制其只能连接到特定网络和主机(见下面),这样可以稍微限制一下入侵者,比如无法使用SHH 端口转发到入侵者的机器。

防火期应该只允许出口流量到:1、已建立的连接,如返回给客户端的数据包2、DNS服务器3、Debian HTTP服务器,升级安装软件4、NTP服务器

0x07 文件系统信息1.挂载的分区对于/etc/fstab里面的每一项,我们都应该查看

× noatime没有被使用,noatime是Linux下文件系统的一个mount选项,表示在读文件时不去更改文件的access time属性了,而缺省时每次读文件,都要更新这个文件的last access time属性。× 是否设置了noexec或者nosuid来阻止用户执行可执行文件和setuid文件。

2.敏感文件比如,这些文件不应该被任何用户查看

× /etc/shadow× /etc/mysql/my.cnf× Apache使用的SSL私匙

3.Setuid文件Setuid是让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令。比如我们用普通用户运行passwd命令来更改自己的口令,实际上最终更改的是/etc/passwd文件我们知道/etc/passwd文件是用户管理的 配置文件,只有root权限的用户才能更改。使用下面命令来查找所有设置了uid的文件:

# find / -perm -4000 -ls 2>/dev/null[...]4948 15 -rwsr-sr-x 1 libuuid libuuid 15208 Jan 25 2011 /usr/sbin/uuidd[...] 41584 34 -rwsr-xr-x 1 root root 34248 Oct 14 2010 /bin/ping41585 36 -rwsr-xr-x 1 root root 36640 Oct 14 2010 /bin/ping641590 34 -rwsr-xr-x 1 root root 34024 Feb 15 2011 /bin/su41595 53 -rwsr-xr-x 1 root root 53648 Jan 25 2011 /bin/umount

4.普通文件查找所有可读可写的文件:

# find / -type f -perm -006 2>/dev/null

还有所有可写文件:

find / -type f -perm -002 2>/dev/null

可以过滤一些已知目录来缩小结果,如加上 | grep -v /tmp 之类的。5.备份文件备份通常也会被管理员所忽略,在这里,我们发现一个目录为/backup,权限为可读,任何用户可以解压etc.tgz来获得shadow文件。0x08 用户信息一个常见的失误配置或者后门是,/etc/passwd中只有root用户的uid为0,如果还有其他用户的uid为0,那么他就会有root权限。注:FreeBSD因为维护和历史原因,除了root的uid为0,还有toor的uid也为0 。在/etc/shadow中,我们需要查看密码的加密算法和密码质量。通过观察hash的格式:

如果没有$标志,那么使用的是DES如果以$1$开始,那么使用的是MD5如果以$2$或者$2a$开始,那么使用的是Blowfish 如果以$5$开始,那么使用的是SHA-256如果以$6$开始,那么使用的是SHA-512

DES和MD5相对来说是比较弱的,要避免使用。通过下面的命令查看默认的加密算法:

$ cat /etc/pam.d/common-password[...]password [success=1 default=ignore] pam_unix.so obscure sha512[...]

为了增加安全性,我们可以安装 libpam-cracklib:

# apt-get install libpam-cracklib

我们可以使用参数minlen来增加复杂性,使用lcredit, ucredit, dcredit 和 ocredit来强制小写字母,大写字母,数字和特殊字符的数量。安装完libcrack之后我们可以看到/etc/pam.d/common-password文件增加了:

$ cat /etc/pam.d/common-password[...]password requisite pam_cracklib.so retry=3 minlen=8 difok=4[...]

difok参数代表新密码中必须有多少位不同于旧密码。强制密码的特殊字符和数字的数量可以使用下面的参数:

$ cat /etc/pam.d/common-password[...]password requisite pam_cracklib.so retry=3 minlen=8 difok=4 ocredit=-2 dcredit=-1[...]

它会强制要求密码包含一个数字和两个特殊字符。John-The-Ripper(http://www.openwall.com/john/)可以被用来破解密码,在大多数的linux发行版中,John-The-Ripper只支持少量的格式,我们可以运行john不加参数来获得支持的格式。

$ john# ...usage information...--format=NAME force hash type NAME: DES/BSDI/MD5/BF/AFS/LM/crypt# ...usage information...

如果想要破解SHA-512之类的密码,需要安装新版的John-The-Ripper。通过下面的命令我们可以暴力破解user的密码:

$ ./john password --format=crypt --wordlist=dico --rules

其中dico为字典文件。sudo的配置也很重要,位于 /etc/sudoers 。

# egrep -v '^#|^$' /etc/sudoersDefaults env_resetroot ALL=(ALL) ALL%sudo ALL=(ALL) ALLuser ALL=(ALL) NOPASSWD: ALL

sudo常见的错误是一个只允许执行少量命令的用户可以执行sudo命令。例如,一个可以访问 /bin/chown和/bin/chmod的用户,可以在复制一个shell到自己的Home目录,然后将其改为所属root用户,并添加setuid位。这样就相当于这个用户有了root权限。0x09 查看服务使用ps来查看运行中的服务。

# ps -edfUID PID PPID C STIME TTY TIME CMDroot 1 0 0 02:21 ? 00:00:00 init [2] root 2 0 0 02:21 ? 00:00:00 [kthreadd]root 3 2 0 02:21 ? 00:00:00 [migration/0]root 4 2 0 02:21 ? 00:00:00 [ksoftirqd/0]root 5 2 0 02:21 ? 00:00:00 [watchdog/0]root 6 2 0 02:21 ? 00:00:00 [events/0]root 7 2 0 02:21 ? 00:00:00 [cpuset]root 8 2 0 02:21 ? 00:00:00 [khelper]root 9 2 0 02:21 ? 00:00:00 [netns]root 10 2 0 02:21 ? 00:00:00 [async/mgr]root 11 2 0 02:21 ? 00:00:00 [pm]root 12 2 0 02:21 ? 00:00:00 [sync_supers]root 13 2 0 02:21 ? 00:00:00 [bdi-default]root 14 2 0 02:21 ? 00:00:00 [kintegrityd/0]root 15 2 0 02:21 ? 00:00:00 [kblockd/0]root 16 2 0 02:21 ? 00:00:00 [kacpid]root 17 2 0 02:21 ? 00:00:00 [kacpi_notify]root 18 2 0 02:21 ? 00:00:00 [kacpi_hotplug]root 19 2 0 02:21 ? 00:00:00 [kseriod]root 21 2 0 02:21 ? 00:00:00 [kondemand/0]root 22 2 0 02:21 ? 00:00:00 [khungtaskd]root 23 2 0 02:21 ? 00:00:00 [kswapd0]root 24 2 0 02:21 ? 00:00:00 [ksmd]root 25 2 0 02:21 ? 00:00:00 [aio/0]root 26 2 0 02:21 ? 00:00:00 [crypto/0]root 219 2 0 02:21 ? 00:00:00 [ata/0]root 220 2 0 02:21 ? 00:00:00 [ata_aux]root 221 2 0 02:21 ? 00:00:00 [scsi_eh_0]root 222 2 0 02:21 ? 00:00:00 [scsi_eh_1]root 294 2 0 02:21 ? 00:00:00 [aufsd/0]root 295 2 0 02:21 ? 00:00:00 [aufsd_pre/0]root 323 2 0 02:21 ? 00:00:00 [loop0]root 738 1 0 02:21 ? 00:00:00 udevd --daemonroot 957 2 0 02:21 ? 00:00:00 [kpsmoused]root 991 738 0 02:21 ? 00:00:00 udevd --daemonroot 992 738 0 02:21 ? 00:00:00 udevd --daemonroot 1307 1 0 02:21 ? 00:00:00 /usr/sbin/rsyslogd -c4root 1341 1 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startwww-data 1344 1341 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startroot 1395 1 0 02:21 ? 00:00:00 /usr/sbin/cronntp 1397 1 0 02:21 ? 00:00:00 /usr/sbin/ntpd -p /var/run/ntwww-data 1423 1341 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startwww-data 1424 1341 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startwww-data 1425 1341 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startwww-data 1426 1341 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startwww-data 1427 1341 0 02:21 ? 00:00:00 /usr/sbin/apache2 -k startroot 1447 1 0 02:21 ? 00:00:00 /bin/sh /usr/bin/mysqld_safemysql 1555 1447 0 02:21 ? 00:00:02 /usr/sbin/mysqld --basedir=/uroot 1556 1447 0 02:21 ? 00:00:00 logger -t mysqld -p daemon.erroot 1618 1 0 02:21 tty1 00:00:00 /bin/login -f root 1619 1 0 02:21 tty2 00:00:00 /bin/login -f root 1620 1 0 02:21 tty3 00:00:00 /bin/login -f root 1621 1 0 02:21 tty4 00:00:00 /bin/login -f root 1622 1 0 02:21 tty5 00:00:00 /bin/login -f root 1623 1 0 02:21 tty6 00:00:00 /bin/login -f user 1626 1623 0 02:21 tty6 00:00:00 -bashuser 1628 1619 0 02:21 tty2 00:00:00 -bashuser 1629 1621 0 02:21 tty4 00:00:00 -bashuser 1630 1620 0 02:21 tty3 00:00:00 -bashuser 1631 1622 0 02:21 tty5 00:00:00 -bashuser 1633 1618 0 02:21 tty1 00:00:00 -bashroot 1727 1 0 02:21 ? 00:00:00 dhclient -v -pf /var/run/dhclroot 1758 1 0 02:21 ? 00:00:00 /usr/sbin/sshdroot 1760 1633 0 02:21 tty1 00:00:00 sudo -sroot 1761 1760 0 02:21 tty1 00:00:00 /bin/bashroot 1845 1758 0 03:46 ? 00:00:00 sshd: user [priv]user 1848 1845 0 03:46 ? 00:00:00 sshd: user@pts/0 user 1849 1848 0 03:46 pts/0 00:00:00 -bashroot 1910 1849 0 06:01 pts/0 00:00:00 sudo -sroot 1911 1910 0 06:01 pts/0 00:00:00 /bin/bashroot 1912 1911 0 06:01 pts/0 00:00:00 ps -edf

另一个办法是使用lsof查看网络连接情况,比如,看看监听UDP的网络连接。

# lsof -i UDP -n -PCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEntpd 1397 ntp 16u IPv4 3861 0t0 UDP *:123 ntpd 1397 ntp 17u IPv6 3869 0t0 UDP *:123 ntpd 1397 ntp 18u IPv4 3875 0t0 UDP 127.0.0.1:123 ntpd 1397 ntp 19u IPv6 3876 0t0 UDP [::1]:123 ntpd 1397 ntp 20u IPv4 5418 0t0 UDP 10.0.2.15:123 ntpd 1397 ntp 21u IPv6 5419 0t0 UDP [fe80::5054:ff:fe12:3456]:123 dhclient 1727 root 6u IPv4 3937 0t0 UDP *:68

我们得到:

1、ntpd运行在端口123(IPV4和IPV6)2、dhclient运行在端口68

接下来查看TCP的情况。

# lsof -i TCP -n -PCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmysqld 1555 mysql 10u IPv4 4073 0t0 TCP *:3306 (LISTEN)sshd 1758 root 3u IPv4 4966 0t0 TCP *:22 (LISTEN)sshd 1758 root 4u IPv6 4968 0t0 TCP *:22 (LISTEN)sshd 1845 root 3r IPv4 5615 0t0 TCP 10.0.2.15:22->10.0.2.2:52439 (ESTABLISHED)sshd 1848 user 3u IPv4 5615 0t0 TCP 10.0.2.15:22->10.0.2.2:52439 (ESTABLISHED)apache2 1966 root 3u IPv4 6502 0t0 TCP *:80 (LISTEN)apache2 1969 www-data 3u IPv4 6502 0t0 TCP *:80 (LISTEN)apache2 1970 www-data 3u IPv4 6502 0t0 TCP *:80 (LISTEN)apache2 1971 www-data 3u IPv4 6502 0t0 TCP *:80 (LISTEN)apache2 1972 www-data 3u IPv4 6502 0t0 TCP *:80 (LISTEN)

我们得到:

1、Apache2运行并监听端口802、mysqld运行并监听端口33063、sshd运行在端口224、user连接到了SSH服务器

Openssh我们注意到Openssh运行在这个镜像,它的配置文件在/etc/ssh/sshd_config,我们首先查看PermitRootLogin选项,该选项决定是否允许root登录。同时我们最好修改其端口(在配置文件中的Port值),使其隐蔽一些(不要忘了在防火墙中加上新的端口)。AllowTcpForwarding的值也应该设置为no,这样可以防止用户使用这个系统做转发或者绕过一些网络层的安全限制。可以看看 http://os.chinaunix.net/a2008/0908/985/000000985303.shtml 。Mysql通过lsof,我们发现mysql的存在,首先应该查看是否设置禁止外网访问,配置文件一般是在/etc/mysql/my.cnf,修改其使其仅能本地访问。

[mysqld]bind-address = 127.0.0.1

下面尝试登录,发现root用户并没有设置密码。

$ mysql -u root

如果没有root的密码,我们可以找到mysql的user表,/var/lib/mysql/mysql/user.MYD,去获得hash。

# strings /var/lib/mysql/mysql/user.MYD  localhostroot 127.0.0.1root localhostdebian-sys-maint*70B6D2E96920B5E2BEE4AE1C719752A021342EF9 localhost wordpress*C260A4F79FA905AF65142FFE0B9A14FE0E1519CC

在Debian下,有一个维护用户(debian-sys-maint),可以访问数据库并导出有用的信息。可以在/etc/mysql/debian.cnf里找到它的密码。登录以后,首先查看数据库版本。

mysql> select @@version;+-------------------+| @@version |+-------------------+| 5.1.63-0+squeeze1 |+-------------------+1 row in set (0.00 sec)

我们可以使用sql语言查询所有用户及其密码 。

mysql> SELECT Host, User, Password FROM mysql.user;+-----------+------------------+-------------------------------------------+| Host | User | Password |+-----------+------------------+-------------------------------------------+| localhost | root | || 127.0.0.1 | root | || localhost | debian-sys-maint | *70B6D2E96920B5E2BEE4AE1C719752A021342EF9 || localhost | wordpress | *C260A4F79FA905AF65142FFE0B9A14FE0E1519CC |+-----------+------------------+-------------------------------------------+4 rows in set (0.00 sec)

也可以使用John-The-Ripper来暴力破解mysql的密码。亦可使用在线Hash破解?http://www.cmd5.com/另一个重点是查看哪些用户有FILE特权,有FILE特权的用户可以使用mysql来访问和创建文件。

mysql> SELECT user,file_priv FROM mysql.user WHERE FILE_PRIV='Y';+------------------+-----------+| user | file_priv |+------------------+-----------+| root | Y || root | Y || root | Y || debian-sys-maint | Y || wordpress | Y |+------------------+-----------+5 rows in set (0.00 sec)

在这里,wordpress用户不应该拥有FILE特权,我们应将其去掉。、Apache配置首先查看是哪个用户在运行apache。可以使用ps或者在apache的配置文件(/etc/apache2/apache2.conf)中查找。

# These need to be set in /etc/apache2/envvarsUser ${APACHE_RUN_USER}Group ${APACHE_RUN_GROUP}

其中的变量来自/etc/apache2/envvars:

export APACHE_RUN_USER=www-dataexport APACHE_RUN_GROUP=www-data

我们还必须确定没有用户可以修改网站的内容,通过DocumentRoot我们知道web放在/var/www/wordpress,通过ls:

# ls -lR /var/www/wordpress/var/www/wordpress/:total 125-rwxrwxrwx 1 www-data www-data 395 Jul 11 07:02 index.php-rwxrwxrwx 1 www-data www-data 19929 Jul 11 07:02 license.txt-rwxrwxrwx 1 www-data www-data 9177 Jul 11 07:02 readme.html-rwxrwxrwx 1 www-data www-data 4264 Jul 11 07:02 wp-activate.phpdrwxrwxrwx 9 www-data www-data 1913 Aug 6 03:26 wp-admin-rwxrwxrwx 1 www-data www-data 1354 Jul 11 07:02 wp-app.php-rwxrwxrwx 1 www-data www-data 271 Jul 11 07:02 wp-blog-header.php-rwxrwxrwx 1 www-data www-data 3522 Jul 11 07:02 wp-comments-post.php-rwxrwxrwx 1 www-data www-data 3456 Jul 11 21:51 wp-config.php[ ... ]

发现其权限并没有加以限制,我们使用chomd修改权限。

chmod -R 744 /var/www/wordpress

为了防止http头泄漏额外的信息,ServerTokens参数最好设置为 Prod,ServerSignature设置为off。 Debian系统中,在/etc/apache2/conf.d/security修改配置。其次,最好关闭列目录的功能,防止信息泄漏。通过Indexes参数决定是否列目录。

  Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all

在这里我们看到列目录功能是开启的。应该使用-Indexes代替Indexes。我们还发现php是开启的。

# ls /etc/apache2/mods-enabled/php* /etc/apache2/mods-enabled/php5.conf /etc/apache2/mods-enabled/php5.load

但是在公共目录php是关闭的。

# cat /etc/apache2/mods-enabled/php5.conf  SetHandler application/x-httpd-php SetHandler application/x-httpd-php-source # To re-enable php in user directories comment the following lines # (from  to .) Do NOT set it to On as it # prevents .htaccess files from disabling it. php_admin_value engine Off 

这样做很合理,防止用户在自己的目录(/~username/)下执行php程序。PHP配置不多说了,参考http://aq.163.com/module/pedia/article-00031.html吧。Crontabrontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。在/var/spool/cron/crontabs中或者使用命令crontab -u -l查看所有的任务。

0 2 * * * /root/backup.sh

我们发现了/root/backup.sh,查看其权限发现可以被任何用户修改,这样是非常不安全的。

# ls -l /root/backup.sh -rwxrwxrwx 1 root root 84 Aug 6 03:38 /root/backup.sh

可以修改其为

chmod 700 /root/backup.sh

0x10 总结在这里展示了linux中潜在的安全问题,以及如何修补他们。这些例子虽然简单,但极具代表性,大家应该学会举一反三,根据每一条自己有所扩展,希望可以帮到大家,谢谢。本文地址:http://chinamars.me/blog/2014/04/linux%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF%E6%9F%A5%E7%9C%8Blinux-host-review/

linux系统信息审查(Linux Host Review)

相关文章:

你感兴趣的文章:

标签云: