你好黑客!今天,我们将使用Python进行快速有趣的脚本挑战。这是在黑客框中的Intro to Dante track上的第一个挑战,被描述为:
“练习机器和挑战,以帮助您为Dante Pro Lab做准备。”
介绍
为了解决这一挑战,我们会遇到一个网站,该网站为我们提供了及时的领域。该字段中说“ MD5”,这表明我们希望我们提交文本的MD5哈希版。
方法:
我抬头看了一个MD5 hash generator website,以完成挑战。我输入了字符串,复制了哈希,并得到了不利的响应:
该网站更改了提供的文字,并告诉我我“太慢了!”。由于我不欣赏它的戏弄,所以我决定通过定制的解决方案来提高我的速度。
识别模板
首先,我需要查看该服务器的普通原始响应的样子,因此我可以解析相关数据,哈希并提交响应以编程方式提交。因此,我认为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:
的有效性看起来正确!现在,我们可以专注于将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后,我发现了为什么这无法正常工作:
知道这一点,我重写了代码以使用单个连贯的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”上的文章!