目录
开头:
学习的视频是哔哩哔哩红队笔记:
红队打靶:Prime1详细打靶思路之模糊测试+内核提权(vulnhub)_prime1靶机-CSDN博客
打靶时参考文章和本文借鉴文章:
红队打靶:Prime1详细打靶提权思路之OpenSSL解密(vulnhub)_openssl提权-CSDN博客
靶机下载链接见:
https://download.vulnhub.com/prime/Prime_Series_Level-1.rar
本文是上文靶机的解法2,是再通过wordpress后台getshel后获得初步立足点,sudo -l 查看当前用户有哪些权限,发现当前用户能不用root 密码运行enc文件,看见enc文件猜测存在openssl加密
为什么看见enc就猜测存在openssl加密嘞?
因为在openssl工具中enc 是封装openssl支持的所有对称加密算法的指令
之前步骤,请看上一篇文章:红队笔记5-Prime1打靶流程-模糊测试+内核提权(vulnhub)-CSDN博客
1.enc 运行密码的查找与破解:
Enc有可执行权限,尝试运行
运行enc文件,发现需要密码,尝试之前的密码,不成功,不建议爆破,我们现在有路可以走,只能看看是否存在密码的备份文件了
使用find命令
find / -name "*backup*"
find / -name “*passwd*”
find / -name “*password*”
看看是否有这些文件,这些命名文件可能藏有密码
有很多信息,其中大部分都是Permission denied 这是报错Permission denied(权限不允许),这种信息是没意义的,干脆把他丢弃掉,用2>/dev/null过滤:
find / -name "*backup*" 2>/dev/null
还是有很多结果,我们只能分析最有可能的对象
Usr 里的help文件,应该是什么的帮助文件,排除
发现几个可疑的对象:
查看可疑文件:
我们移动到了可疑目录打开了文件,发现了密码backup_password 还叫我们enjoy,这个多半是了
尝试使用root运行 good ,应该是运行成功了,看下当前文件夹是否发生了变化
生成了两个文件enc.txt 和key.txt 这更加让我们明确了这是OpenSSL解密,因为openssl enc,对称加密,加密时,通常是需要提供密钥的,密钥是用于加密和解密数据的关键信息。
enc.txt和key.txt两个文件一个密钥一个密文,才能解密
什么是openSSL?
OpenSSL 可以用来加密,有对称加密和非对称加密,其中在openssl命令中enc 就是封装了openssl所以对称加密算法的一个参数,所以当我们看见enc就应该猜测是openssl
打开两个文件:
enc.txt:是一串字符串,应该就是openssl加密后的密文:
ket.txt: 看名字都知道是密钥,通过key中的信息
我知道你是 ippsec 的粉丝。
因此,将字符串“ippsec”转换为 md5 哈希值,并使用它以真实形式获得自己。(这应该就是密钥,使用这个密钥去解密enc文件中的密文)
叫我们把ippsec转为md5
md5sum:
这里有个细节,在进行md5加密的时候,要使用
echo -n “ippsec” | md5sum
因为在终端用echo输出的“ippsec“ 是à”ippsec/n” 这样直接去MD5sum 会把/n也加密,使用我们应该使用-n参数去掉/n
可以看到两次加密的结果完全不一样
去掉/n后发现后面有一个 – 我们使用
echo -n 'ippsec' | md5sum | awk -F ' ' '{print $1;}'
awk是对字符串进行处理的一个工具,awk -F ' ' '{print $1;}'意思是以空格为分割,打印其中第一个部分,这样就会只输出366a74cb3c959de17d61db30591c39d1 后面的‘-’不会输出
我们就获得了key中的线索,因为我们猜测这是应该openssl 这一个是openssl对称加密中的密钥
366a74cb3c959de17d61db30591c39d1
那么enc.txt文件就是密文了,所以我们应该对enc.txt 解密l
2.openssl解密参数确定:
接下来我们开始openssl解密
openssl解密需要:
1.密文;
2.密钥;
3.加密算法
看下帮助文档:
这里应该就是封装在enc中的对称加密算法
这有一大堆标准命令和加密方式,标准命令中有enc,如果要想解密,我们必须要知道加密方式才行。这里我们采用的命令应该就是enc了,那么加密方式是啥呢?又有哪些参数呢?我们先看看enc命令的相关参数吧:
openssl enc –h
这里关于OpenSSL有一大堆参数,我们这里要解密,要用到-d,另外enc.txt看起来相似base64编码的,那么我们还有使用-a,当然用-base64也行,还要使用密钥key,参数-K,可是有个问题,-K后参数的说明他写到,需要Raw key,in hex 意思是需要16进制的格式,我们刚才得到的md5应该没有转换为这个形式,因此需要转化为16进制形式。
那我们就先对key进行16进制
echo -n "ippsec" | md5sum | awk -F ' ' '{print $1;}' | od -A n -t x1
使用此命令输出结果最后还有一个由换行符转换而来的空字符0a,我们不想要这个,干脆前面就把换行符干掉使用tr –d ‘\n’去掉换行符(-d是删除delete的意思)
继续进行处理,我们想把这个结果放在一行显示,同时去掉空格,再用tr –d 依次干掉换行和空格就好了,命令为:
最后把密钥处理完成
3336366137346362336339353964653137643631646233303539316333396431
最终结果为3336366137346362336339353964653137643631646233303539316333396431。这就是openssl解密过程中-K后面的参数,即密钥的16进制形式。下面我们就可以构造对enc.txt进行OpenSSL解密的命令,完整命令为:
echo "nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=" | openssl enc -d -a -cipher -K 3336366137346362336339353964653137643631646233303539316333396431
这一段参数非常长,echo后面引号内的内容就是enc.txt中的密文,使用OpenSSL enc进行解密,-d是进行解密,-a意思是base64解码(也可以直接用-base64),-K后面接参数密钥raw的16进制hex形式,关键就在于-cipher应该替换为解密的算法,前面我们查看openssl enc的帮助的时候。我们看到了许多加密算法:
有这么多对称加密的算法,我们不知道密文采用什么加密算法,所有我们只能通过枚举的方法,替换payload 中-cipher(有经验的大佬,可以根据密文特征,猜测加密算法)
3.OpenSSL解密(bash脚本)
上一步说我们要想办法枚举所有的加密方式的可能。那么最好就是写一个bash脚本,依次遍历每个加密方式,带入OpenSSL的解密命令执行,看看哪个能成功解密出明文。既然要使用脚本进行遍历,我们首先要创建一个文件,把这个openssl –h的内容关于加密算法的内容复制到一个文件中。去掉其中无关的行,结果如下
我们将所以加密形式,保存下来,倒是替换payload 的 -cipher 位置
但是要读取文件,我们文件里面的数据应该是每一个单独一行,所以我们要对数据做处理
首先把所有空格替换为换行符,这样就可以保证每一项字符串独占一行,使用gsub()函数用于将空格替换为换行符,完整命令如下:
awk '{gsub(" ","\n");print}' CypherTypeRaw | sort | uniq
现在我们可以构造bash脚本,写一个for循环,将CipherTypes中的每一行替换为上述命令中的-cipher,bash脚本如下:
for cipher in $(cat CypherTypes); do echo "nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=" | openssl enc -d -a -$cipher -K 3336366137346362336339353964653137643631646233303539316333396431 ;done
运行:
有太多报错了,因此我们重新构造命令输出每次遍历的字符串(即解密方式)。由于使用其他解密方式都会报错,我们将报错信息丢弃2>/dev/null ,完整的命令为:
for cipher in $(cat CypherTypes); do echo "nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=" | openssl enc -d -a -$cipher -K 3336366137346362336339353964653137643631646233303539316333396431 2>/dev/null;echo $cipher;done
解密成功了 ,加密算法是aes-256-cbc
别担心,总有一天我们会达到的
我们的目的地很快。如果你忘记了
您的用户名,然后使用您的旧密码
==> “tribute_to_ippsec”
这句话意思就是我们得到了saket的密码为tribute_to_ippsec,很可能就是saket账户ssh登录的密码。同时还有一个名为Victor的落款,不知道能不能用上。
就尝试一下ssh登录
4.提权:
登录进来了,sudo -l
提示我们,可以无密码的形式以root运行/home/victor/undefeated_victor,那就运行试试
sudo /home/victor/undefeated_victor
结果说,找不到/tmp/challenge这个文件,还给了一句提示:如果你能够打败我,就先挑战站在你面前的你。既然他说找不到/tmp/challenge这个文件,那咱们就去tmp目录下看看:
确实是没有名为challenge的文件呀,以root运行/home/victor/undefeated_victor会去运行/tmp/challenge,如果challenge中包含提权的指令,那么一旦运行就可以提权了,现在既然没有这个challenge文件,那咱就创建一个,tmp文件也可以写入文件
echo '#!/bin/bash' > challenge
echo '/bin/bash' >> challenge
chmod +x challenge
赋予运行权限
sudo /home/victor/undefeated_victor
提权成功!!
5.总结
本篇文章是根据靶场作者给出的提权通过openssl解密获得saket用户密码,在saket用户sudo -l提权成功,没有使用内核提权,也是作者想让我们学习openssl解密:
1.enc运行密码的查找:find 找备份文件->缺少密码时可以通过查找备份文件可能存有密码
2.密钥的处理:我们获得密钥,对其进行md5加密(md5sum)和16进制转换(od)
3.openssl解密参数构造:查看openssl帮助文档,确定参数
4.openssl解密(bash脚本):因为openssl解密需要知道密文的加密算法,我们不知道,写bash脚本枚举所有算法。
通过靶场我学习到了:
1.在渗透过程中缺少密码,可以使用find查找备份文件
2.openssl解密:1,密文;2,密钥;3,加密算法 缺一不可
3.awk,md5sum,od,tr等字符串处理命令
4.bash脚本