入侵盒子写作:终生的emdee五
#教程 #python #安全 #网络安全

你好黑客!今天,我们将使用Python进行快速有趣的脚本挑战。这是在黑客框中的Intro to Dante track上的第一个挑战,被描述为:
“练习机器和挑战,以帮助您为Dante Pro Lab做准备。”

介绍

为了解决这一挑战,我们会遇到一个网站,该网站为我们提供了及时的领域。该字段中说“ MD5”,这表明我们希望我们提交文本的MD5哈希版。

Image description

方法:

我抬头看了一个MD5 hash generator website,以完成挑战。我输入了字符串,复制了哈希,并得到了不利的响应:

Image description

该网站更改了提供的文字,并告诉我我“太慢了!”。由于我不欣赏它的戏弄,所以我决定通过定制的解决方案来提高我的速度。

识别模板

首先,我需要查看该服务器的普通原始响应的样子,因此我可以解析相关数据,哈希并提交响应以编程方式提交。因此,我认为Burp Suite不会在这里对我有所帮助,因为它不会让我了解它需要解析的情况。我认为Python可以完成工作。

抓住回应

我打开了有史以来最伟大的编辑,并写道:

import requests
response = requests.get('http://134.209.176.83:30536') # change this for your instance!
print(response.content)

这非常简单,但是它可以解决问题。运行此代码给了我以下响应:

b'<html>\n<head>\n<title>emdee five for life</title>\n</head>\n<body style="background-color:powderblue;">\n<h1 align=\'center\'>MD5 encrypt this string</h1><h3 align=\'center\'>c3WOTbjAmW4hFDHQpCjZ</h3><center><form action="" method="post">\n<input type="text" name="hash" placeholder="MD5" align=\'center\'></input>\n</br>\n<input type="submit" value="Submit"></input>\n</form></center>\n</body>\n</html>\n'

我再运行几次,以确保我对格式有很好的了解。

太好了!现在,我要做的就是在响应中删除相关信息。

解析输出

我尝试使用像.split()这样的经典Python方法来解析输出,但我遇到了以下内容。

TypeError: byte indices must be integers or slices, not str

事实证明这仍然是原始字节,而不是适当的字符串类型。

我的代码的以下更新已解决此问题:

import requests
response = requests.get('http://134.209.176.83:30536')
res = response.content

res = res.decode('utf-8')

print(res)

现在,我们的输出是一个正确格式化的字符串:

<html>
<head>
<title>emdee five for life</title>
</head>
<body style="background-color:powderblue;">
<h1 align='center'>MD5 encrypt this string</h1><h3 align='center'>pV0iSaxkboFU0E07UayP</h3><center><form action="" method="post">
<input type="text" name="hash" placeholder="MD5" align='center'></input>
</br>
<input type="submit" value="Submit"></input>
</form></center>
</body>
</html>


抓取特定的输出

现在是时候将输出降低到我们需要的文本了。我们可以使用任何解析方法,但我发现This stack overflow answer最有帮助。

import requests
response = requests.get('http://104.248.160.75:31480')
res = response.content

res = res.decode('utf-8')

mystr = res
search = "3 align='center'>"
start = mystr.index(search)+len(search)
stop = mystr.index("</h3>", start)
res = (mystr [ start : stop ])

print(res)

现在我们有了原始的“字”。

现在让我们哈希!

哈希词

According to stack overflow,我们可以使用以下行来制作单词的MD5哈希:

import hashlib
print(hashlib.md5(res.encode('utf-8')).hexdigest())

使用以下代码应产生有效的MD5哈希:

import requests
import hashlib
response = requests.get('http://178.128.167.10:31790')
res = response.content

res = res.decode('utf-8')

mystr = res
search = "3 align='center'>"
start = mystr.index(search)+len(search)
stop = mystr.index("</h3>", start)
res = (mystr [ start : stop ])

print(res)

print("MD5 version:")

print(hashlib.md5(res.encode('utf-8')).hexdigest())

输出应该看起来像这样:

fJHiQK1isKuPYxbEulUH
MD5 version:
80ed60f85b4fbbc982b5816912b1ba6a

别忘了!我们总是可以验证an online tool:

的有效性

Image description

看起来正确!现在,我们可以专注于将Hashed消息发送回服务器!

发送哈希

在原始响应中,我们看到HTML字段名称称为“哈希”,因此我们将使用该字段名称提交我们的响应。 After a bit of reading,语法对于requests库变得非常简单。我们只需要词典来保存我们的数据并提交我们的回复。随之而来的是,我们的代码现在看起来如下:

import requests
import hashlib
# Grabbing and decoding
url = 'http://178.128.167.10:31790'
response = requests.get(url) 
res = response.content
res = res.decode('utf-8')
# Parsing out the word
mystr = res
search = "3 align='center'>"
start = mystr.index(search)+len(search)
stop = mystr.index("</h3>", start)
res = (mystr [ start : stop ])
print(res)

# Hashing as MD5
print("MD5 version:")
hash = (hashlib.md5(res.encode('utf-8')).hexdigest())
print(hash)

# Sending the hash
payload = {"hash":hash}
response = requests.post(url, data=payload)
res = response.content
flag = res.decode('utf-8')
print("\n\n" + flag)

所有东西看起来都可以使用,所以让我们运行吧!

输出:

我们的旗帜...还是不是?

LSByV3cfj4CH7ufR5G2a
MD5 version:
46b323c4923e460759346454210adb8f


<html>
<head>
<title>emdee five for life</title>
</head>
<body style="background-color:powderblue;">
<h1 align='center'>MD5 encrypt this string</h1><h3 align='center'>OLWB7P9EqGd03jHmmXRN</h3><p align='center'>Too slow!</p><center><form action="" method="post">
<input type="text" name="hash" placeholder="MD5" align='center'></input>
</br>
<input type="submit" value="Submit"></input>
</form></center>
</body>
</html>

似乎我们太慢了。

我认为我们会足够快,但是我们的代码效率过低。我们必须找到一种方法来加快速度,但是首先我们需要找出当前的速度!

时钟我们的代码

让我们看看代码运行的速度。

我们可以使用time命令将其计时

time python3 payload.py屈服于我们:

real    0m0.690s
user    0m0.173s
sys 0m0.017s

为什么它不起作用:

阅读了有关此挑战的blog post后,我发现了为什么这无法正常工作:

Credit to Soren_codes

知道这一点,我重写了代码以使用单个连贯的session而不是发送随机分离请求。

我们的代码现在看起来像这样:

import requests
import hashlib
# Grabbing and decoding
url = 'http://161.35.166.224:32511'
session = requests.session()
response = session.get(url) 
res = response.content
res = res.decode('utf-8')
# Parsing out the word
mystr = res
search = "3 align='center'>"
start = mystr.index(search)+len(search)
stop = mystr.index("</h3>", start)
res = (mystr [ start : stop ])
print(res)

# Hashing as MD5
print("MD5 version:")
hash = (hashlib.md5(res.encode('utf-8')).hexdigest())
print(hash)


# Sending the hash
payload = {"hash":hash}
response = session.post(url, data=payload)
res = response.content
flag = res.decode('utf-8')
print("\n\n" + flag)

只有几个小更改,但它产生了巨大的变化!

输出:

C7RrJ4GN4f2tMK51Z8JZ
MD5 version:
d185f72466f92c697b6c9ed3ca496ebe


<html>
<head>
<title>emdee five for life</title>
</head>
<body style="background-color:powderblue;">
<h1 align='center'>MD5 encrypt this string</h1><h3 align='center'>C7RrJ4GN4f2tMK51Z8JZ</h3><p align='center'>HTB{N1c3_ScrIpt1nG_B0i!}</p><center><form action="" method="post">
<input type="text" name="hash" placeholder="MD5" align='center'></input>
</br>
<input type="submit" value="Submit"></input>
</form></center>
</body>
</html>

得到教训

这样的时代使我想起了it's okay to use writeups,甚至the best people in the field do it to learn!。如果我没有停下来阅读文章,我就不明白为什么需要使用requests.session(),而我将无法进步。学习新事物时很容易感到沮丧,但是如果您卡住了,那么保持沮丧是没有意义的。

感谢您的阅读!一定要回来阅读我在“ heist”上的文章!

Image description