wechall靶场training系列通关记录
wechall靶场Training系列通关记录
Training: Get Sourced
第一题很简单,获取藏在网页源代码中的密码。F12
查看网页中的注释即可找到答案:
Training: Stegano I
这张图片使用了简单的图片隐写术。首先右键图片,将其保存到本地,然后使用任意十六进制编辑器打开即可找到密码。我使用的软件是ImHex:
Training: Crypto - Caesar I
这串字符串是凯撒密码。可以用以下python脚本来枚举所有可能的明文:
def caesar_decrypt(ciphertext, shift):
plaintext = ""
for c in ciphertext:
if c.isalpha():
c = chr((ord(c) - shift - 65) % 26 65)
plaintext = c
return plaintext
ciphertext = "BPM YCQKS JZWEV NWF RCUXA WDMZ BPM TIHG LWO WN KIMAIZ IVL GWCZ CVQYCM AWTCBQWV QA WIXLWWPIXZPK"
for shift in range(26):
print(f"shift={shift}: {caesar_decrypt(ciphertext, shift)}")
运行结果:
shift=8
时文字是有意义的,密码是OAPDOOHAPRHC
。
Training: WWW-Robots
这关的主题是robots.txt
。访问一下wechll的robots.txt:
再访问一下robots.txt
中的这个链接https://www.wechall.net/challenge/training/www/robots/T0PS3CR3T即可完成挑战。
Training: ASCII
把这些数字转换成对应的字符即可,可以使用以下python脚本:
numbers = [84, 104, 101, 32, 115, 111, 108, 117, 116, 105, 111, 110, 32, 105, 115, 58, 32, 111, 100, 104, 108, 100, 111, 103, 103, 98, 111, 110, 97]
for number in numbers:
print(chr(number), end='')
运行结果:The solution is: odhldoggbona
,成功找到密码。
Encodings: URL
这个字符串使用了URL编码。我的方法是按F12
打开控制台,然后使用javascript
的decodeURIComponent
函数来解码:
然后访问一下这个链接https://www.wechall.net/challenge/training/encodings/url/saw_lotion.php?p=lbcferphbadg&cid=52#password=fibre_optics即可完成挑战。
Training: No DNS
我们先直接访问这个链接试试:
看来不对。再看看这个链接,格式很像是wechall的一个地址。我们把make.love.not.war.com
换成wechall.net
再访问一下:
提示说我们必须向make.love.not.war.com
这个域名发起请求。那么我们的目的就显而易见了:请求https://make.love.not.war.com/challenge/training/net/nodns/etc/hosts.php这个网址,但是却要访问https://www.wechall.net/challenge/training/net/nodns/etc/hosts.php。出题人的意思是让我们改hosts文件。我们可以在hosts文件中新增一条记录:
5.44.104.158 make.love.no.war.com
其中5.44.104.158
是wechll.net
的ip,windows可以用nslookup wechall.com
查看指定网址的ip。之后使用ipconfig /flushdns
命令刷新本机的DNS缓存,可能还需要刷新一下浏览器的缓存(有的浏览器比较特别,无论怎么折腾它就是不愿意用hosts中的ip)。之后再访问https://make.love.not.war.com/challenge/training/net/nodns/etc/hosts.php即可,但是会提示说需要登录,因为域名变了,之前的登录信息就失效了,可以先访问https://make.love.not.war.com登录一下再去访问上面的网址。
另一种方法是使用curl
,无序修改hosts,而是修改headers中的Host来达到目的:
curl -s -0 -v -H 'Host: make.love.not.war.com' -H 'Cookie: WC=你的Cookie' http://www.wechall.net/challenge/training/net/nodns/etc/hosts.php?ajax=1
Prime Factory
题目翻译:
你的任务很简单:
找到大于100万的前两个素数,它们的独立数字和也是素数。
以23为例,它是一个素数,其数字和5也是素数。
密码是两个数字的连接,
示例:如果第一个数字是1,234,567
第二个是8,765,432,
你的密码就是12345678765432。
可以使用以下python脚本来解题:
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n ** 0.5) 1):
if n % i == 0:
return False
return True
def sum_of_digits(n):
sum = 0
while n > 0:
sum = n % 10
n //= 10
return sum
def main():
# 从1,000,001开始
n = 1000001
# 已找到的符合要求的素数
count = 0
# 找两个符合要求的素数
while count < 2:
if is_prime(n):
if is_prime(sum_of_digits(n)):
print(n)
count = 1
n = 1
main()
运行结果:
1000033
1000037
那么10000331000037
就是本题答案。这道题只需要遍历37个数。
ps:这道题有个小bug,1不是素数,但在本题中被视为素数。
Training: Encodings I
这是一道关于编码的题。题目提示语言是英语,那么很有可能用的是ASCII码。每个字符的ASCII码是由7个二进制位组成的。我一开始做题的时候下意识地觉得每8个二进制位是一组,卡了好久才反应过来。
我们打开作者提供的软件,把这串0和1复制进去,BitsPerBlock
填7
,选择Binary->Binary Format
格式化字符串:
然后再选择Binary->Binary To Ascii
即可找到密码:easystarter
。
Training: Programming 1
题目要求我们访问一个链接,该链接会返回一个字符串,以这个字符串作为answer
参数访问第二个链接即可过关。访问第一个链接时需要带上Cookie:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kg6PfUlL-1673956330983)(D:\Documents\xazl\articles\wechall靶场training系列通关记录\assets\image-20230109130724153.png)]
以下是使用python的解法。先用requests.get
访问第一个链接,然后直接在浏览器中打开第二个链接:
import requests
import webbrowser
url1 = "http://www.wechall.net/challenge/training/programming1/index.php?action=request"
url2 = "http://www.wechall.net/challenge/training/programming1/index.php?answer="
c = {"WC": "你的Cookie"}
key = requests.get(url1,cookies=c).text
print(key)
webbrowser.open(url2 key)
Training: Regex
这一题有好几个level。Level 1的要求是写一个匹配空字符串的正则表达式,答案如下:
/^$/
^
:匹配字符串的开头。$
:匹配字符串的结尾。
所以,这个正则表达式只会匹配空字符串,因为空字符串没有开头也没有结尾。
Level 2,让我们匹配wechall
这个字符串,很简单:
/^wechall$/
Level 3,需要让我们匹配符号要求的文件名。这关还有一个隐藏要求,就是不能捕获任何字符串,所以要使用非捕获组的语法?:
,答案如下:
/^wechall4?\.(?:jpg|gif|tiff|bmp|png)$/
?
:前一个元字符是可选的。此处4
是可选的。?:
:可以在组内匹配字符,但是不将匹配的字符捕获为组。】|
:表示“或”的意思。此处有多个文件名后缀都是符合要求的。\.
:匹配一个点.
。因为在正则表达式中.
表示匹配任意字符,所以需要加一个反斜杠来转义。
Level 4,要求仅捕获文件名,加一对括号即可。答案如下:
/^(wechall4?)\.(?:jpg|gif|tiff|bmp|png)$/
至此成功过关。
Training: PHP LFI
这一关涉及到PHP的LFI(本地文件包含)漏洞。该漏洞允许攻击者在服务器上包含本地文件。根据题目要求,我们需要包含../solution.php
这个文件。../solution.php
的地址为:https://www.wechall.net/challenge/training/php/lfi/solution.php。当前网页的地址为:https://www.wechall.net/challenge/training/php/lfi/up/index.php。
通过观察可以发现,solution.php
在当前目录的父目录的父目录,即../../solution.php
。
在题目给出的三个链接中随便挑一个点一下,发现URL中有一个file参数,这个参数就是包含的文件。我们只需想办法包含solution.php
这个文件即可过关。
再观察一下源代码:
$filename = 'pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome").'.html';
include $filename
文件名后面还会拼接一个.html
。这意味着如果我们直接传入../../solution.php
,$filename
会变成../../solution.php.html
。这时就需要使用空字节