http://drops.wooyun.org/ 最专业的安全知识分享平台
http://www.freebuf.com/ 关注黑客与极客
http://book.beifabook.com/product/BookDetail.aspx?Plucode=712105019 Linux安全体系分析与编程目录
最佳的策略是采用分层的方法,即将“老当益壮”的程序,如Snort、 iptables等老前辈与psad、Apparmor、SELinuxu等一些新生力量结合起来,借助强大的分析工具,我们就可以始终站在技术的前沿。
IDS新宠:PSAD。Psad是端口扫描攻击检测程序的简称,它作为一个新工具,可以与iptables和Snort等紧密合作,向我们展示所有试图进入网络的恶意企图。
老当益壮:Snort。它是一款轻量级且易于使用的工具,可以独立运行,也可以与psad和iptables 一起使用
简洁方便:chkrootkit和rootkit。Rootkit检测程序chkrootkit和rootkit Hunter也算是老牌的rootkit检测程序了
多面手:Tripwire。Tripwire是一款入侵检测和数据完整性产品
CGI漏洞
CGI是Common Gateway Interface(公用网关接口)的简称,并不特指一种语言。
Web服务器的安全问题主要包括:1)Web服务器软件编制中的BUG;2)服务器配置的错误。可能导致CGI源代码泄漏,物理路径信息泄漏,系统敏感信息泄漏或远程执行任意命令。CGI语言漏洞分为以下几类:配置错误、边界条件错误、访问验证错误、来源验证错误、输入验证错误、策略错误、使用错误等等。CGI漏洞大多分为一下几种类型:暴露不该暴露的信息、执行不该执行的命令、溢出。
一次利用show files类cgi漏洞成功入侵uta.edu的经历
http://www.chinaunix.net/bbsjh/19/23.html cgi漏洞利用
httpd的error_log分析
[Mon Apr 06 04:45:39 2015] [error] [client 46.28.206.148] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): / [Mon Apr 06 04:56:57 2015] [error] [client 70.46.57.98] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi [Mon Apr 06 04:57:01 2015] [error] [client 70.46.57.98] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): / [Tue Apr 07 01:18:45 2015] [error] [client 97.91.223.228] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi [Tue Apr 07 01:18:49 2015] [error] [client 97.91.223.228] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /
第一步获取域名与ip关系
[Tue Apr 07 11:32:01 1010 /dev/pts/0 192.168.2.250 ~]#ping www.fltdz.com
PING www.fltdz.com (58.64.136.166) 56(84) bytes of data.
64 bytes from 58.64.136.166: icmp_seq=1 ttl=48 time=79.6 ms
64 bytes from 58.64.136.166: icmp_seq=2 ttl=48 time=76.2 ms
64 bytes from 58.64.136.166: icmp_seq=3 ttl=48 time=63.2 ms
^C
--- www.fltdz.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2245ms
rtt min/avg/max/mdev = 63.245/73.044/79.639/7.069 ms
第二步请出瑞士军刀nc(netcat)
[Tue Apr 07 11:32:47 1011 /dev/pts/0 192.168.2.250 ~]#yum install nc
我用get / http/1.1来取得他的webserver的相关信息
[Tue Apr 07 11:32:47 1011 /dev/pts/0 192.168.2.250 ~]#nc -vv 58.64.136.166 80
Connection to 58.64.136.166 80 port [tcp/http] succeeded!
输入下面,然后两次回车
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Server: nginx/1.0.2
Date: Tue, 07 Apr 2015 03:43:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
ac
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.0.2</center>
</body>
</html>
0
[Tue Apr 07 11:33:59 1012 /dev/pts/0 192.168.2.250 ~]#
第三步由于信息量太少请出扫描器之王nmap
[Tue Apr 07 11:46:16 1015 /dev/pts/0 192.168.2.250 ~]yum install nmap
[Tue Apr 07 11:46:16 1015 /dev/pts/0 192.168.2.250 ~]#nmap -sS -O -vv 192.168.2.2
Starting Nmap 5.51 ( http://nmap.org ) at 2015-04-07 11:46 CST
Initiating ARP Ping Scan at 11:46
Scanning 192.168.2.2 [1 port]
Completed ARP Ping Scan at 11:46, 0.00s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 11:46
Completed Parallel DNS resolution of 1 host. at 11:46, 0.09s elapsed
Initiating SYN Stealth Scan at 11:46
Scanning 192.168.2.2 [1000 ports]
Discovered open port 111/tcp on 192.168.2.2
Discovered open port 22/tcp on 192.168.2.2
Discovered open port 5500/tcp on 192.168.2.2
Discovered open port 5801/tcp on 192.168.2.2
Discovered open port 5666/tcp on 192.168.2.2
Discovered open port 10000/tcp on 192.168.2.2
Discovered open port 5901/tcp on 192.168.2.2
Discovered open port 2049/tcp on 192.168.2.2
Discovered open port 1521/tcp on 192.168.2.2
Discovered open port 6001/tcp on 192.168.2.2
Discovered open port 10003/tcp on 192.168.2.2
Discovered open port 80/tcp on 192.168.2.2
Completed SYN Stealth Scan at 11:46, 1.10s elapsed (1000 total ports)
Initiating OS detection (try #1) against 192.168.2.2
Retrying OS detection (try #2) against 192.168.2.2
Retrying OS detection (try #3) against 192.168.2.2
Retrying OS detection (try #4) against 192.168.2.2
Retrying OS detection (try #5) against 192.168.2.2
Nmap scan report for 192.168.2.2
Host is up (0.00023s latency).
Scanned at 2015-04-07 11:46:25 CST for 13s
Not shown: 988 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
1521/tcp open oracle
2049/tcp open nfs
5500/tcp open hotline
5666/tcp open nrpe
5801/tcp open vnc-http-1
5901/tcp open vnc-1
6001/tcp open X11:1
10000/tcp open snet-sensor-mgmt
10003/tcp open documentum_s
MAC Address: E4:1F:13:80:ED:2C (IBM)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=5.51%D=4/7%OT=22%CT=1%CU=34628%PV=Y%DS=1%DC=D%G=Y%M=E41F13%TM=552
OS:3531E%P=x86_64-redhat-linux-gnu)SEQ(SP=108%GCD=1%ISR=109%TI=Z%CI=Z%II=I%
OS:TS=A)OPS(O1=M5B4ST11NW7%O2=M5B4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7%O5
OS:=M5B4ST11NW7%O6=M5B4ST11)WIN(W1=16A0%W2=16A0%W3=16A0%W4=16A0%W5=16A0%W6=
OS:16A0)ECN(R=Y%DF=Y%T=40%W=16D0%O=M5B4NNSNW7%CC=N%Q=)T1(R=Y%DF=Y%T=40%S=O%
OS:A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=Y%DF=Y%T=40%W=16A0%S=O%A=S+%F=AS%O=M5B4ST1
OS:1NW7%RD=0%Q=)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=4
OS:0%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%
OS:Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=16
OS:4%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)
Uptime guess: 39.383 days (since Fri Feb 27 02:34:52 2015)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=264 (Good luck!)
IP ID Sequence Generation: All zeros
Read data files from: /usr/share/nmap
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.87 seconds
Raw packets sent: 1103 (52.326KB) | Rcvd: 1076 (46.626KB)
[Tue Apr 07 11:46:38 1016 /dev/pts/0 192.168.2.250 ~]#
linux安全手段
1 改名,强密码,改端口,开防火墙 2 组策略,ipsec策略 1、用chattr命令防止系统中某个关键文件被修改 # chattr +i /etc/fstab 然后试一下rm mv rename等命令操作于该文件,都是得到Operation not permitted 的结果 2、让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作 # chattr +a /data1/user_act.log 3、不能修改root密码 lsattr /etc/passwd /etc/shadow chattr -i /etc/passwd chattr -i /etc/shadow 再修改root的密码就可以 chattr +i /etc/passwd chattr +i /etc/shadow 策略与手段 1.对目录设置粘滞位限定用户只能对自己的文件进行处理 stick bit 2.对文件设置setuid可以让执行该命令的用户以该命令拥有者的权限去执行,setuid使用不是无限制的。出于安全目的,只能应用在Linux ELF格式二进制文件上,而不能用于脚本文件。 3.防止某个文件被修改 chattr 4.安全分区与只读分区 mount -o remount,noexec,ro 5.root无法远程登录 手段有三个 6.操作机,机房与公司,全部通过公钥认证,避免密码泄漏 7.一律在win中cmd界面,用命令,这样不会有记录 想限制root在指定终端登录。如下做后,无法登录。 1、在 /etc/pam.d/sshd 添加 auth required pam_securetty.so 2、在/etc/securetty 中添加 pts/0 pts/1 依然无法用root登录ssh服务器。 PS:我的系统是arch。注释掉/etc/pam.d/sshd中的 pam_securetty.so,可以登录。 vim /etc/ssh/sshd_config #PermitRootLogin yes 找到这一行,去掉注释。 改为 PermitRootLogin no service sshd restart 我们经常使用SSH登录管理服务器,在享受便利的同时也会遇到一些安全隐患,最常见的就是SSH密码被暴力破解。如果我们将SSH密码设置的过于复杂,又不容易记,因此限制SSH登录方式,只能使用key登录是一个不错的选择,既可以保证安全性,又非常方便。具体的修改方式如下: 1、添加信任key,并测试能否不通过密码直接登录 将公钥信息加入用户目录的SSH认证key文件下。(linux下可以用ssh-keygen命令生成,windows下可以用SecureCRT等工具生成) 比如,将如下格式的公钥信息拷贝到/root/.ssh/authorized_keys ssh-rsa AAAAB3.....H+5w== hujiankang@qiyi.com 此时,带有对应私钥的机器就已经拥有了访问该机器root账户的权限。 完成配置后,请采用带对应私钥的机器访问服务器,如果不提示输入password,直接登录,则证明配置正确。 2、修改SSH配置文件并重启SSH服务 SSH配置文件的位置:/etc/ssh/sshd_config 找到其中的两个参数配置: PasswordAuthentication ChallengeResponseAuthentication 将这两个参数值修改为no: PasswordAuthentication no ChallengeResponseAuthentication no 然后重启SSH服务。 # service sshd restart 现在我们就已经限制用户的SSH登录方式,只允许用key方式登录。 进一步测试,如果我们用一台不带信任key的机器尝试登录,那么会提示如下信息。 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 证明限制SSH登录方式成功。 可以说sudo命令补偿了它的一个致命缺陷,那就是任何一个想转为root用户的人都得掌握root用户的密码 linux安全设置 1.删除所有那些不能在你系统上使用的默认用户和组账户: lp,sync,shutdown,halt, news, uucp, operator, games, gopher 2.ROOT自动从shell注销,编辑你的配置文件”vi /etc/profile”,在某个地方加入如下行, “HISTFILESIZE=” TMOUT=3600 我们为变量”TMOUT=”输入的这个值使用秒表示的、代表一个小时(60*60=3600秒)。如果你将此行加入你的“/etc/profile” 文件,那么在一小时的 非活动状态之后将要系统里的所有用户自动注销。你可以在用户私人的”.bashrc”文件里面设置这个变量,可以在一个确定的时间以后自动注销他们。 3.禁止并且卸载所有没有用的服务 你必须禁止一切卸载所有你不用的的服务,那样的话,你就能少担心一些。看看你的”/etc/inetd.conf”文件,用注释的方法禁用(在一行的开始加个#), 然后给inetd进程发送一个SIGHUP命令去更新到当前的”inetd.conf”文件。这样做: 第一步把”/etc/inetd.conf”更改许可权限成600,那样的话,就只有root可以读和写。 [Root@kapil /]# chmod 600 /etc/inetd.conf 第二步确保”/etc/inetd.conf”的所有者是root。 第三步编辑inetd.conf文件(vi /etc/inetd.conf),并且禁止一些服务,就像:ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等, 除非你打算用它。关闭这些服务就降低一些风险。 第四步给你的inetd进程发送一个HUP信号 [root@kapil /]# killall -HUP inetd 第五步设置”/etc/inetd.conf”文件为不可更改,使用 chattr 命令,这样的话,没人能修改那个文件。简单的设置文件为不可更改,执行如下命令: [root@kapil /]# chattr +i /etc/inetd.conf 这将防止对”inetd.conf”文件的任何更改(意外的更改或者其他更改)。只有超级用户root能设置或者清除这个文件属性。修改inetd.conf 简单的取消不可更改的设置,执行如下命令: [root@kapil /]# chattr -i /etc/inetd.conf 4.免疫”/etc/services”文件 你必须免疫 “/etc/services” 文件,防止未经授权的删除、增加服务。 免疫 “/etc/services” 文件,使用命令: [root@kapil /]# chattr +i /etc/services 5.禁止Control-Alt-Deletc键盘关机命令 在你的”/etc/inittab”文件里面注释掉如下的行(用一个”#”)。 编辑inittab文件(vi /etc/inittab), 更换: ca::ctrlaltdel:/sbin/shutdown -t3 -r now 读入: #ca::ctrlaltdel:/sbin/shutdown -t3 -r now 现在,按照如下提示输入,让更改生效: [root@kapil /]# /sbin/init q 6.为脚本文件整理”/etc/rc.d/init.d”下的权限 整理脚本文件的许可权限,可靠的开始和结束所有你需要在引导时运行的常态进程,这样做: [root@kapil/]# chmod -R 700 /etc/rc.d/init.d/* 这意味着只有root可以被允许读,写,和执行目录里面的脚本文件。 7.隐藏你的系统信息 默认状态下,当你登录到linux机器时,他告诉你Linux分布商的名字,版本,核心版本和服务器名字。这对一个骇客来说从你的服务器得到这些信息足够了,所以必须立刻用一个”Login:”提示符提示用户。 第一步 这样做,编辑”/etc/rc.d/rc.local”文件,放置”#”在如下行的前面。 # This will overwrite /etc/issue at every boot. So, make any changes you # want to make to /etc/issue here or you will lose them when you reboot. #echo “” >; /etc/issue #echo “$R” >;>; /etc/issue #echo “Kernel $(uname -r) on $a $(uname -m)” >;>; /etc/issue # #cp -f /etc/issue /etc/issue.net #echo >;>; /etc/issue 第二步 然后,删除如下文件:在”/etc/”目录下的”issue.net” 和 “issue”: [root@kapil /]# rm -f /etc/issue [root@kapil /]# rm -f /etc/issue.net 8.禁止未用的 SUID/SGID 程序 一个常规用户如果设置为SUID root,将能够作为root运行程序。一个系统管理员必须最小化使用这些 SUID/GUID程序,而且禁止那些不需要的程序。 第1步 从root拥有的程序里发现所有有`s’位的程序,用此命令: [root@kapil]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ; 在被选中的程序上禁止suid 位,键入如下命令: [root@kapil /]# chmod a-s [program] 9.关闭ipv6 vi /etc/modprobe.conf,在文件中添加以下两行 alias net-pf-10 off alias ipv6 off
我怎样才能区分程序是否使用了PAM验证? 使用ldd命令,如果这个程序的使用的动态连接库没有libpam和libpam_misc,那它肯定不使用PAM验证。然而,还有可能已经包含这两个库了,但是因为某些问题,程序无法正常工作。因此需要更好的方法来测试。 对于需要使用PAM的程序,需要在/etc/pam.d目录中为其设置配置文件。配置文件的名字被编写进程序源代码中,通常和程序的名字是一样的,但不总是这样。例如:有个程序叫作pamprog,它的PAM配置文件是/etc/pam.d/pamprog。在配置文件中,只有下面两行: auth required pam_permit.so auth required pam_warn.so 现在对其进行测试。第一行,表示所有的用户都允许通过;第二行表示想syslog中写入一条警告信息。如果测试成功,就表示程序能够使用PAM进行验证。然后你可以在配置文件中加入更为复杂的验证功能。 [root@84-monitor ~]# ldd /usr/bin/passwd|grep pam libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fdfac008000) libpam.so.0 => /lib64/libpam.so.0 (0x00007fdfab620000) [root@84-monitor ~]# ldd /bin/login|grep pam libpam.so.0 => /lib64/libpam.so.0 (0x00007f7d4c9d8000) libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f7d4c7d0000) [root@84-monitor ~]# ldd /usr/sbin/sshd|grep pam libpam.so.0 => /lib64/libpam.so.0 (0x00007f20629b8000)
[root@84-monitor pam.d]# ldd /usr/sbin/crond|grep pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007f6095e38000)