目录

简介

信息收集

漏洞发现

文件包含漏洞

漏洞利用

用户chiv的Shell

权限提升

解密ciphertext

用户pain的Shell

用户root的Shell

总结


简介

这是一台练习CTF的好靶机,靶机创作者有很多提示,但是也有很多坑,总体来说有一定的难度,涉及文件包含、加解密、逆向分析等知识。通过提示发现备份站点是关键,然后利用文件包含漏洞收集信息发现FTP登录凭据,使用SSH获得用户chiv的Shell,通过pain用户的SUID执行文件读取备份文件获得用户pain的MySQL数据库凭据,同样可以使用SSH获得Shell,通过枚举攻击解密密文,获得加密磁盘镜像的密码,从而获得root用户的SSH私钥文件,得到root权限Shell。

信息收集

使用nmap扫描扫描目标主机开放的常用端口及运行的服务,发现开启22和80端口,分别运行着ssh和http服务,且目标主机操作系统可能为ubuntu 2.6.32,如图:

然后访问80端口的http服务,发现网站被重定向到http://forwardslash.htb/,如图:

然后将forwardslash.htb添加到hosts文件再进行访问,如图:

网站名称是反斜杠派,而主机名称是正斜杠,从网页内容中发现来自反斜杠派的嘲讽,服务器使用了XML和FTP自动登录,反斜杠派可能利用这点黑了该网站,且他们是Sharon的忠实追随者。使用Google搜索关键字,只搜索到Apache反斜杠目录遍历漏洞,但对该靶机不适用。使用dirbuster扫描网站目录和php,bak,zip,sql等文件未发现有价值的信息,但在模糊测试时发现存在.php文件(也可能是目录),但是没有权限访问,如图:

使用wfuzz扫描目录的时候发现存在.htaccess和.htpasswd文件,以及server-status目录,但都没有访问权限,如图:

再次扫描网站txt文件发现存在note.txt文件,如图:

查看内容发现反斜杠派有备份站点,如图:

然后使用wfuzz利用Host头枚举子域名,当Host为backup.forwardslash.htb时发生跳转,如图:

将backup.forwardslash.htb添加到hosts文件,然后访问,如图:

页面跳转到登录页面。扫描网站目录及文件发现如下文件,如图:

漏洞发现

测试登录框发现不存在SQL注入漏洞,然后注册一个账户,如图:

登录之后跳转到welcome页面,如图:

文件包含漏洞

跳过重置密码,登出和修改用户名功能,查看修改个人资料图片,如图:

但是表单被禁用了,然后定位到submit按钮源码,发现有disabled属性,URL表单同样如此,如图:

将该属性删掉后就可以使用了,如图:

使用BurpSuite拦截数据包,将test.com改为http://127.0.0.1,如图:

页面返回index.php文件内容,如图:

说明此处存在远程文件包含漏洞。后来发现直接使用绝对路径也可以读取文件内容,所以此处也存在本地文件包含漏洞。

漏洞利用

利用该漏洞读取/etc/passwd文件,发现存在普通用户pain和chiv,如图:

然后在Kali Linux创建一个包含php代码的txt文件,并利用该漏洞包含此文件,如图:

发现并没有执行该代码,而仅仅是将文件内容显示了出来。然后读取/var/www/html/index.php文件内容,如图:

该文件是forwardslash.htb网站的index.php文件。尝试使用相对路径读取backup.forwardslash.htb网站的index.php文件,如图:

没有权限查看,尝试使用,base64编码读取,如图:

解码之后,如图:

这说明可以执行同级目录下的php文件,但没有权限在同级目录下创建php文件,因此无法利用该漏洞直接getshell。然后读取其他文件,在config.php中包含数据库用户名和密码等信息,如下:

<?php
//credentials for the temp db while we recover, had to backup old config, didn't want it getting compromised -pain
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'www-data');
define('DB_PASSWORD', '5iIwJX0C2nZiIhkLYE7n314VcKNx8uMkxfLvCTz2USGY180ocz3FQuVtdCy3dAgIMK3Y8XFZv9fBi6OwG6OYxoAVnhaQkm7r2ec');
define('DB_NAME', 'site');/* Attempt to connect to MySQL database */
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);// Check connection
if($link === false){die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>

用户chiv的Shell

在dev/index.php文件中发现ftp用户chiv的密码,如图:

尝试使用22端口的ssh服务登录成功,如图:

权限提升

查看内核版本,如图:

内核版本符合CVE-2019-13272,但无法利用成功,使用CVE-2018-18955也无法利用成功。

解密ciphertext

查看发现user.txt文件在/home/pain目录下,且note.txt文件提示重要文件被加密了,如图:

查看encryptorinator目录下的文件发现密文和python加密程序文件,如图:

python加密程序内容如下:

def encrypt(key, msg):key = list(key)msg = list(msg)for char_key in key:for i in range(len(msg)):if i == 0:tmp = ord(msg[i]) + ord(char_key) + ord(msg[-1])else:tmp = ord(msg[i]) + ord(char_key) + ord(msg[i-1])while tmp > 255:tmp -= 256msg[i] = chr(tmp)return ''.join(msg)def decrypt(key, msg):key = list(key)msg = list(msg)for char_key in reversed(key):for i in reversed(range(len(msg))):if i == 0:tmp = ord(msg[i]) - (ord(char_key) + ord(msg[-1]))else:tmp = ord(msg[i]) - (ord(char_key) + ord(msg[i-1]))while tmp < 0:tmp += 256msg[i] = chr(tmp)return ''.join(msg)print encrypt('REDACTED', 'REDACTED')
print decrypt('REDACTED', encrypt('REDACTED', 'REDACTED'))

代码中包含一个加密函数、一个解密函数和一组测试数据,加密算法是对称密码,加密密钥和解密密钥是相同的,但是密钥会在哪里呢。

利用明文是可打印的字符串这一特性,编写python程序进行枚举,但是没有获得明文,这说明要么rockyou.txt中没有密码,要么明文中包含有不可打印的字符,读取密文发现密文长度为165,说明明文也是165个字符,假设可打印字符为160个,然后逐渐减少可打印字符数量,直到有满足条件的明文出现,程序decrypter.py如下:

#!/usr/bin/python
from threading import Thread
import linecache
import stringdef decrypt(key, msg):key = list(key)msg = list(msg)for char_key in reversed(key):for i in reversed(range(len(msg))):if i == 0:tmp = ord(msg[i]) - (ord(char_key) + ord(msg[-1]))else:tmp = ord(msg[i]) - (ord(char_key) + ord(msg[i-1]))while tmp < 0:tmp += 256msg[i] = chr(tmp)return ''.join(msg)def brute(filename,start,end,ciphertext):global isExitwhile start < end:#If one thread decrypts successfully, all threads are terminatedif isExit:return 0#Read the file from start line to end linepassword=linecache.getline(filename,start)plaintext=decrypt(password,ciphertext)#If the number of printable characters is greater than 160, the decrypted plaintext is outputif sum(i in string.printable for i in plaintext)>160:print "\033[1;32;1m[+] Password is :",password,"\033[0m"print "[+] Plaintext is :",plaintextisExit=Truestart+=1def threadbrute(func,filename,lines,thread):threadlist=[]ciphertext=open('ciphertext','r').read()for i in range(thread-1):threadlist.append(Thread(target=func,args=(filename,i*lines,lines*(i+1),ciphertext)))threadlist.append(Thread(target=func,args=(filename,(thread-1)*lines,crows,ciphertext)))for i in threadlist:#Set thread as guardian thread,Allow termination via CTRL + Ci.setDaemon(True)i.start()try:while i.isAlive():passexcept KeyboardInterrupt:print "[!] Stop by KeyboardInterrupt!"
#Exit flag
isExit=False
wordlist='/usr/share/wordlists/rockyou.txt'#Get dictionary lines
crows=len(linecache.getlines(wordlist))
#Divide the dictionary into blocks equal to the number of threads
lines,ad=divmod(crows,200)print("[*] Cracking Password ......")
threadbrute(brute,wordlist,lines,200)

可打印字符大于160时未获得满足条件的输出,当可打印字符大于155时解密成功,明文中告知了/var/backups/recovery目录下加密映像的密钥,如图:

但是当前用户没有权限查看。

用户pain的Shell

然后继续查看其他文件,在/var/backups目录下发现另一个提示和config.php.bak文件,如图:

文件只对所有者pain用户具有读写权限,且提示需要密码才能读取。使用提权辅助脚本LinEnum.sh枚举发现所有者为pain的SUID文件,如图:

使用linux-smart-enumeration枚举,同样发现SUID文件,如图:

尝试运行发现提示并报错,提示还没有读到正确的文件,只有在同一秒钟内执行备份时才有效。且报错内容为32位16进制字符串不存在或不可访问,如图:

验证发现32位16进制字符串是当前时间戳的MD5值,如图:

从报错信息结合/var/backups/note.txt文件提示推测,当前时间戳的MD5值就是Pain所说的密码,backup程序应该是读取文件名为当前时间戳MD5值的文件内容,但是需要在一秒内将当前时间戳MD5的值作为文件名指向/var/backups/config.php.bak,并执行/usr/bin/backup程序,这就需要写个程序来实现了。使用bash命令更加简单:

ln -s /var/backups/config.php.bak $(date | cut -d' ' -f4 | tr -d $'\n' | md5sum | cut -d' ' -f1); backup

使用该命令成功读取到config.php.bak文件内容,但这仅仅是MySQL数据库用户pain的凭据,如图:

很奇怪使用该凭据并不能成功登录MySQL,但是却可以使用ssh进行登录,如图:

但这需要足够细心和很强的逻辑推理能力,我也是看了大佬的提示花了很长时间才明白backup程序的功能。也有大佬使用ltrace和strace调试分析程序的功能,当然我更喜欢使用IDA,如图:

可以清晰的看到,当MD5值的文件不存在是输出错误,否则就读取文件内容。

用户root的Shell

再次使用提权辅助脚本LinEnum.sh发现无需密码就可使用sudo的命令,但命令有限制,如图:

回到之前解密后的明文中提到的/var/backups/recovery目录,发现加密的备份镜像文件,如图:

使用提权辅助脚本枚举到的无需密码的sudo命令结合前边获取到的加密映像的密钥,解密并映射到/dev/mapper/backup,如图:

然后在具有写权限的目录下创建mnt目录,使用sudo /bin/mount /dev/mapper/backup ./mnt/进行挂载,如图:

查看目录内容发现id_rsa文件,如图:

应该是root用户的ssh私钥,使用该文件成功登录,如图:

总结

在该靶机刚发布不久我没能成功攻破,由于忽略了对txt文件的扫描,没能找到作者提示的备份站点。在该靶机退休后看了下大佬们的思路,然后又学习了一遍。作者给的提示也很多,但是有时候提示太多也容易混乱,而且坑也比较多。首先在文件包含漏洞那里花了很长时间,以为直接是通过文件包含漏洞获得Shell,在发现密文后,解密过程又花了很多时间,研究backup程序的功能也是,猜了很久,最后还是用了IDA分析。

Hack The Box——ForwardSlash相关推荐

  1. 【Hack The Box】linux练习-- SneakyMailer

    HTB 学习笔记 [Hack The Box]linux练习-- SneakyMailer

  2. Hack The Box - Access Writeup

    第一次尝试Hack The Box,在难度较低的Access上,前后花了有两天的时间,汗.收获还是很大,在此记录一下,以便后阅. 首先是获取user,通过nmap扫描,可以发现目标主机开了三个端口21 ...

  3. Hack The Box - Meta 利用Exiftool远程代码执行漏洞获取webshell,ImageMagrick命令执行漏洞横向提权,更改环境配置SUDO纵向提权

    Hack The Box - Meta Hack The Box开始使用流程看这篇 文章目录 Hack The Box - Meta 整体思路 1.Nmap扫描 2.Exiftool远程代码执行漏洞( ...

  4. 【Hack The Box】linux练习-- Blunder

    HTB 学习笔记 [Hack The Box]linux练习-- Blunder

  5. Hack The Box - Catch 利用let chat API查询信息,Cachet配置泄露漏洞获取ssh登录密码,apk代码注入漏洞利用获取root权限

    Hack The Box-Catch Hack The Box开始使用流程看这篇 文章目录 Hack The Box-Catch 整体思路 1.Nmap扫描 2.apk文件信息收集 3.lets ch ...

  6. 【Hack The Box】windows练习-- Silo

    HTB 学习笔记 [Hack The Box]windows练习-- Silo

  7. 【Hack The Box】linux练习-- Ophiuchi

    HTB 学习笔记 [Hack The Box]linux练习-- Ophiuchi

  8. 【Hack The Box】linux练习-- Doctor

    HTB 学习笔记 [Hack The Box]linux练习-- Doctor

  9. 【Hack The Box】linux练习-- Tabby

    HTB 学习笔记 [Hack The Box]linux练习-- Tabby

最新文章

  1. css超过两行显示为..._这6种组织CSS的方式,可以帮助你解决CSS扩展维护难的问题...
  2. 让Transformer的推理速度提高4.5倍,这个小trick还能给你省十几万
  3. 如何在 Python 中创建一个简单的神经网络
  4. Node.js 入门详解(四)
  5. ORM框架SQLAlchemy使用学习
  6. theme为dialog的Activity如何充满全屏
  7. sql获取服务器系统时间,sql怎么读取系统日期和时间
  8. 服务器的日常运维巡检视频,日常运维检查记录表
  9. 237. 删除链表中的节点
  10. 歌词遍历案例 lrc文件
  11. 微信小程序上线缓存及解决办法
  12. 这是关于物理学的最强科普
  13. 史上最详细SharePoint 2007安装步骤图解新手教程
  14. java计算机毕业设计失物招领信息交互平台源代码+数据库+系统+lw文档
  15. redmi ax6s刷机体验和救砖
  16. 用html写一首古诗,怎么用html/css写一首古诗
  17. 11.29 随堂练习
  18. 查找jar包是否存在、引用某个类
  19. CSRF---跨站请求伪造
  20. 微信公众号定时推送消息

热门文章

  1. 分享65个NET源码,总有一款适合您
  2. Android视频滤镜添加硬解码方案
  3. python邮箱爆破_python制作企业邮箱的爆破脚本
  4. 属性加密(ABE)基础知识
  5. IEEE754标准原文,及浮点数在线转换
  6. php做照片墙,照片墙作业练习
  7. 扔旧被子扔掉霉运_您应该扔掉所有高科技产品盒吗?
  8. 滴滴出行A/B测试数据分析
  9. Matlab使用串口进行数据通信
  10. IT运维管理人力成本困境该如何破解?