Ugra CTF Quals 2021
Антивирус Antivipyc
Югорские разработчики создали новый облачный антивирус, с больщой точностью определяющий вредоносные приложения. Но хорошо ли протестирован сам антивирус?
Ugra 开发人员开发了一种新的云防病毒软件,可以高度准确地检测恶意程序。 但是防病毒软件本身是否经过了良好的测试?
环境给出的是一个上传的表单,尝试上传发现会有文件正常和恶意文件两种反馈。
上传一个源代码文件可发现网页响应时间较久,推测代码在被检测的过程中被执行了。尝试将表单中的 ext 参数改为 py 后随便上传一个 Python 脚本发现响应如下。
Не удалось проверить файл /tmp/uploads/1.py: плагин /app/plugins/py.py не найден
报错给出了上传文件的路径 /tmp/uploads/1.py
。此时的拓展名被拼接到了文件名后面形成了 /app/plugins/py.py
,此时如果使用目录穿越,则可以执行其他的文件。构造一波目录穿越,使得其后缀为 ../../tmp/uploads/1
,此时得到的文件名就是 /app/plugins/../../tmp/uploads/1.py
。在上传的文件中构造如下脚本。
import os
os.system("cat /etc/passwd")
将其作为源代码文件上传即可得到如下内容。
ugra_who_checks_the_checker_b48847d6ef8eНе удалось проверить файл /tmp/uploads/1.py
ugra_who_checks_the_checker_b48847d6ef8eНе
Книга пути и достоинства daodejing
Китайская мудрость утверждает, что, чтобы не сбиться с трудного пути, необходимо употреблять достаточное количество одного витамина. Не собьётесь?
题目给出的附件中可以得到如下信息(太长了放在了 Ubuntu Pastebin)。
https://paste.ubuntu.com/p/NsTsDFrszc/
SVG Path
- M = moveto
- L = lineto
- H = horizontal lineto
- V = vertical lineto
- C = curveto
- S = smooth curveto
- Q = quadratic Belzier curve
- T = smooth quadratic Belzier curveto
- A = elliptical Arc
- Z = closepath
以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
将 SVG 文件补充完整。
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<path d="{ FILE CONTENT }" />
</svg>
使用浏览器打开可以得到如下内容。
ugra_grandpa_take_your_pills_or_we_will_beat_up_your_61e33e4865869f4c
ЦНИИВТ
Устроился системным администратором в Центральный НИИ вычислительной техники. На второй неделе работы обнаружил в локальной сети какой-то странный компьютер. Поспрашивал у коллег — все впервые слышат о нём, даже не знают, на каком этаже он стоит.
Искал пару дней, в итоге нашёл его в подсобке под слоем пыли — такое ощущение, что лет 30 к нему никто не прикасался. Самое удивительное — это то, что он каким-то образом подключен к интернету, и на нём даже открыт порт. При подключении просит пароль, я его раздобыл в архиве. Но вместо данных сервер шлёт какой-то мусор.
Поможете разобраться? Вдруг там что-то важное!
- Пароль:
9bd0f869bb947165bd66ba2e7f5a5aeb
写个脚本把控制台发送的内容接收回来。
from pwn import *
connection = remote("soviet.q.2021.ugractf.ru", 17792)
connection.recvline()
connection.sendline("9bd0f869bb947165bd66ba2e7f5a5aeb")
content = connection.recvall()
file = open("out.bin", "bw")
file.write(content)
file.close()
可以得到如下内容。
ÛßßßßßÛ ß Ûß ÜÜß ÜÜßÛÛßÜÜÛ ÜßÜ Û ÛßßßßßÛÛ ÛÛÛ Û ßßÛÜßßßÜ ß ÛÜ ßÛÛß Üß Û ÛÛÛ ÛÛ ßßß Û ß ßßÜß ÜßÜÛ ß Üß ßÛßÜßÛ Û ßßß Ûßßßßßßß Û ÛÜÛ ßÜÛÜßÜÛÜÛ ßÜß Û ß Û ßßßßßßß Ü ÜÛßÜÜÛß ßßÛ ßß ßÛßßÜßÜÛÛ ßÜÜ ßÜÛÜÛ ßÜÜ ßÜßßÛßÜÛÛÛßÜßßßÜÛÜÜÛßÛÛ ßÜßßÜÜß Ü Û Ü ÛÜ ß ßßÛ ÜÜßÛßÜÛ ÜßÛÜßÜÛÛÜß ß ßÛßßÛÜßÜÜÛÜÛÛÛ ÜßÛÛß ßÛÛ ÛÜßÛßÛÛ ÛÛ ßÛßÜÛ ÜßÜßÜÜÜÜßßÜÛßßßÛÛß ÜÛ ßÛÛßÛßÜ ÜÜßÛßÛßßßÜÜßÛÜß ÜÜÛ Û ßÛßÜÛÛÜÜß Ü ÛßÛ ÜßÜßÜÛÛÜÜÜÜÜÜ ÛÛßÜÛ ßÛß ßÛÛÜßßßÛÛÛÜ ÛÛÛ ÛßÛ ßÛ ÜÛ ß ÜÛÛß Ü ÜÛßß ßßÜÜ ÜÛ Û ß Ü ßÛ ß Ü ßÛ ÛÛ Ü ßÜ ßßÜÛÜßÜÜßÜÜÜÜÜÜßß ßß ÛÜÜßÜ ÛÛÜÜ ßÛÜÛÜßÛÛßÜ ßÜÜÛÛ Û ÜÜÛÛß Ü ßÛßß Üß ß ÜÛÛÜÜÜÜÛÛßÛßÜ ß Ü ßÛÜÛßßÛß ÜÛÜßß ßÜÜÛÛ ÜÛßßÜßÜßÜÛßßÜ Ûß ÜßßÛÛßÛ ÜÛßßß ÛÛÜ Û ÜÛß ß ÛßßÜ ß ÜÛ ÜÛßÛÜ Ü ÜÛßßÜÛßßßÛÜÛ ßÛßßßßßÛ ÜßÛßÛÜÜÜßßÛÜßÜÜÛ ßÜß ßÜÛ ß ÛÛ Ü Û ÛÛÛ Û Ü ÜßÜß ÜÛÛß ÛÜ Ü ÜÜßßßßÛßßß ÜÛÛ ßßß Û ÜÛßÛßßÛ ßÛÛ ßÛÛÜÜßÛ ÜßßÛÛßß ÛßÜßßßßßßß ßßßß ßßßß ß ßßßß ß ß ßßß
总共有 861 个字符,很容易求得其两个真约数为 21、41。猜测其是一个二维码,修改脚本如下。
from pwn import *
connection = remote("soviet.q.2021.ugractf.ru", 17792)
connection.recvline()
connection.sendline("9bd0f869bb947165bd66ba2e7f5a5aeb")
content = connection.recvall()
print("[+] Recieved {}".format(content))
content = content.replace(b"\xdb", b"\xe2\x96\x88") # █
content = content.replace(b"\xdf", b"\xe2\x96\x80") # ▀
content = content.replace(b"\xdc", b"\xe2\x96\x84") # ▄
content = content.decode()
print("[*] Content parsed as {}".format(content))
for x in range(21):
print(content[x * 41 : (x + 1) * 41])
可以得到如下结果。
█▀▀▀▀▀█ ▀ █▀ ▄▄▀ ▄▄▀█▄▀█ █ ▄▀▄ █ █▀▀▀▀▀█
█ ███ █ ▀▀█▄▀▀▀▄ ▀ █▄ ▀█▄▀ ▄▀ █ ███ █
█ ▀▀▀ █ ▀ ▀▀▄▀ ▄▀▄█▀█▀ ▄▀ ▀█▀▄▀█ █ ▀▀▀ █
▀▀▀▀▀▀▀ █ █▄█ ▀▄█▄▀▄█▄█ ▀▄▀ █ ▀ █ ▀▀▀▀▀▀▀
▄ ▄█▀▄▄█▀ ▀▀█ ▀▀ ▀█▀▀▄▀▄██ ▀▄▄ ▀▄█▄█ ▀
▄▄ ▀▄▀▀█▀▄███▀▄▀▀█▄█▄▄█▀██ ▀▄▀▀▄▄▀ ▄ █ ▄
█▄ ▀ ▀▀█ ▄▄▀█▀▄█ ▄▀█▄▀▄█▀▄▀ ▀ ▀█▀▀█▄▀▄▄█
▄███ ▄▀█▀▀ ▀██ █▄▀█▀█▀▀█▀ ▀█▀▄█ ▄▀▄▀▄▄▄▄
▀▀▄█▀▀▀██▀ ▄█ ▀██▀ ▀▄ ▄▄▀█▀█▀█▀▄▄██▄▀ ▄
▄█▀ █ ▀█▀ ██▄▄▀ ▄ █▀█ ▄█▄ ▄██▄▄█▄▄▄ ███▄█
▀▀▀ ▀▀█▄▀▀▀███▄ ███ █▄█ ▀█ ▄█ ▄▀▄▄█▀
▄ ▄█▀ ▀▀▄▄ ▄█ █ ▀▀ ▄ ▀█ █ ▀█ █▄ ▄
▀▄ ▀▀▄█▄ ▄▄▀▄▄▄▄▄▄▀▀ ▀█ █▄▄ ▄▄ ██▄▄ ▀█
▄█▄▀██▀▄ ▀▄▄██ █ ▄▄█▀▀ ▀ ▀█▀▀ ▄▀ ▀ ▄██▄▄
▄███▀▀▀▄ ▀▀▄▄██▄██▀█▀ ▄ ▄█▄▀▀ ▀▄▄██ ▄
█▀▀▄▀▄▀▄█▀▀▄ █▀ ▄▀▀██▀█ ▄█▀▀▀ ██▄ █ ▄█
▀ ▀ █▀▀▄ ▀ ▄█ ▄█ █▄ █ ▄█▀▀▄█▀▀▀█▄█ ▀
█▀▀▀▀▀█ ▄▀█▀█▄▄▄▀▀█▄▀▄▄█ ▀▄▀ ▀▄█ ▀ ██ ▄
█ ███ █ ▄ ▄▀▄▀ ▄██▀ █▄ ▄ ▄▄▀▀▀▀█▀▀▀ ▄█
█ ▀▀▀ █ ▄█▀█▀▀█▀▀██ ▄▀██▄▄▀█ ▄▀▀██▀▀ █▀▄
▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀▀▀▀ ▀ ▀ ▀▀▀
Word 稍微排一下,可以得到如下图片。
Parse QR Code
即可以得到 flag。
ugra_soviet_technologies_are_eternal_369863efd250
Новейшая разработка developers
Это исходный код программного обеспечения, разработанного очень крутыми разработчиками. Но иногда и они допускают ошибки. Ну так, по невнимательности.
这是非常出色的开发人员开发的软件的源代码。 但是有时候他们也会犯错误。 好吧,无意间。
使用 git fsck 可以 dangling 出一个 commit。此时查看相关 commit 可得到 flag。
commit 7f3b10fd4fdf9a74cab201e4f3f8ece5cf9e4833
Author: Validian <validian@validian.name>
Date: Wed Dec 11 06:00:30 2019 +0845
added info.txt.
diff --git a/info.txt b/info.txt
new file mode 100644
index 0000000..d3849f0 /dev/null
+++ b/info.txt
@@ -0,0 +1,7 @@
+If you are reading this, I am definitely dead by now.
+
+I also know that by reaching this file, you have demonstrated
+the best of your ability and courage. Here is the key to my
+lifetime secret: ugra_the_yellow_purse_6f557934d3d1f541
+
+You will understand what to do next. Good luck!
ugra_the_yellow_purse_6f557934d3d1f541