HackTheBox - forwardSlash



首先说明,这台机器是比较困难的。

一开始扫描的时候开放了2个端口

 22 open ssh 
 80 open http 主要信息来源

1,80 端口就挂着一张图片,联系到以前看过有人把图片和文件结合,试着破解文件。

2,提取关键字暴力破解ssh。

最后事实证明我的2个思路都错了,看了官网的提示信息这是一台多域名主机。


果然扫描出来了 backup.forwardslash.htb




一个本地文件包含漏洞



获取 Pain 用户:

这个地方有点复杂,/usr/bin/backup 程序自动读取当前的【时:分:秒】进行MD5加密,所以写了个 python 程序

from datetime import  datetime
import hashlib,os
hl = hashlib.md5()
datetime = datetime.now().strftime('%H:%M:%S')
hl.update(datetime.encode(encoding='utf-8'))

time_now = os.popen("date +%T").read()
md5 = lambda x: hashlib.md5(x).hexdigest()
name_file_new = md5(time_now.replace("\n", ""))

execute = "ln -s /var/backups/config.php.bak ./{0} && /usr/bin/backup".format(name_file_new)
os.system("touch /home/chiv/1.txt")

t = os.system(execute + " && touch /home/chiv/1.txt")

print(t)

执行完,顺利输出 /var/backups/config.php.bak 文件内容


一开始打算用 shell 脚本写的,shell 脚本的 md5sum 太坑,计算还带特殊符号的。


破解程序,给的程序片段是如下的代码:

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 -= 256
msg[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 += 256
msg[i] = chr(tmp)
return ''.join(msg)


t1 = encrypt('REDACTED', 'REDACTED')
t2 = decrypt('REDACTED', encrypt('REDACTED', 'REDACTED'))

print(t1)
print(t2)

奈何,看了两天依旧没看出路数。

这种程序我的办法就是化解Key的运算效果。

把计算过程输出,看有没有规律能够把Key 的计算效果给弄没了。奈何,找了N久,找不到。

看网上有人说,可以暴力破解Key,参照别人写了这样的程序:
import math
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 += 256
msg[i] = chr(tmp)
return ''.join(msg)

# fryption tool, pretty secure huh, anyway here is the key to the encrypted image from /var/backups/recovery: cB!6%sdH8Lj^@Y*$C2cf
# testkey:ttttttttttttttttt

def fuckMe(text):
# ASCII码从32126为键盘上的有效图形
for i in range(1, 200):
for k in range(33, 127):
testkey = chr(k) * i
result = decrypt(testkey, text)

if 'the ' in result or 'be' in result or 'and' in result or 'of' in result:
print("---------------------------")
print("result:" + result, end="\t")
print("testkey:" + testkey, end="\t")
print("---------------------------")


out = open("t1/ciphertext", encoding='ISO-8859-1')
t1 = fuckMe(out.read().rstrip())

以下是输出部分:


当然,确实是输出了结果。不过这是在 Key  原本就不复杂的情况下。如果Key是一个MD5字符串,估计这样是计算不出来的。《不过这个思维可以学习一下》

提权部分

需要挂载磁盘,然后输入密码。

挂载完成后,就可以获取root私钥了。


评论