๐ŸดCTF/webhacking.kr

webhacking.kr - old-04(Challenge 4)

Janger 2023. 2. 15. 19:26
728x90

์ฒซ ํ™”๋ฉด์€ ์–ด๋–ค ํ•ด์‹œ๊ฐ’์ด ์จ์ ธ ์žˆ๊ณ  ์•„๋ž˜์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ณณ์ด ์žˆ๋‹ค. 

[view-source]๋ฅผ ๋ˆŒ๋Ÿฌ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณธ๋‹ค. 

 

if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);

์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ key(๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉฐ, chall4 ์„ธ์…˜๊ณผ ์ผ์น˜ํ•˜๋ฉด solve(4)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

์ œ์ผ ์ค‘์š”ํ•œ ์•„๋žซ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด

 

$hash rand(10000000,99999999)."salt_for_you";

10000000~99999999๊นŒ์ง€์˜ ๋žœ๋ค์˜ ์ •์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ "salt_for_you"๋ผ๋Š” ์†”ํŠธ๋ฅผ ํ•ฉ์นœ๋‹ค. 

๊ทธ๋ž˜์„œ ์ด "๋žœ๋ค์ˆซ์ž_salt_for_you"๋Š” chall4 ์„ธ์…˜์— ํ• ๋‹นํ•œ๋‹ค. 

 

 

for($i=0;$i<500;$i++) $hash sha1($hash);

๋‹ค์‹œ ์•„๋ž˜๋กœ ๋Œ์•„์™€์„œ for๋ฌธ์„ ๋ณด๋ฉด 500๋ฒˆ์„ $hash๋ฅผ sha1ํ•จ์ˆ˜์— ๋„ฃ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. 

 

<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>

์ตœ์ข…์ ์œผ๋กœ ํ•ด์‹œํ™”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํžŒํŠธ๋กœ ๋ณด์—ฌ์ค€๋‹ค. 

 

๊ฒฐ๊ตญ ๋„์ „์ž๋Š” ์ง์ ‘ ๋งŽ์€ ์–‘์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹œํ™”ํ•œ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์„œ ํ‘ธ๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค. 

 

 

chall4.py
import hashlib
import threading
import os, shutil, time

salt = "salt_for_you"

start_time = None

def encodeSHA1(s):
    sha1 = hashlib.new('sha1')
    sha1.update(bytes(s, 'utf-8'))
    return sha1.hexdigest()


def solver(min, max, tid):
    global start_time
    n=0

    for num in range(min, max):
        
        with open( "./table" + "/" + str(tid) + "_rainbow_table.txt", "a") as f:

            h = k = str(num) + salt
            for _ in range(500):
                h = encodeSHA1(h)

            if not (num%1000):
                print(f"(thread_{tid} | {round(n / len(range(min, max)) * 100, 5)}%) [{round(time.time() - start_time)} sec]")
                
            data = k + " = " + h + "\n"
            f.write(data)
                
        n += 1
    print(f"(thread_{tid} | {round(n / len(range(min, max)) * 100, 5)}%) [{round(time.time() - start_time)} sec]")


if __name__ == '__main__':

    start_time  = time.time()

    start = 10000000
    end = 100000000

    if not os.path.exists("./table"):
        os.mkdir("./table")
    else:
        shutil.rmtree("./table")
        os.mkdir("./table")


    t1 = threading.Thread(target=solver, args=(start, end//2, 1))
    t1.start()

    t2 = threading.Thread(target=solver, args=(end//2, end, 2))
    t2.start()

    t1.join()
    t2.join()

    os.system("pause")

๊ทธ๋ž˜์„œ ์ง์ ‘ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋ณด์•˜๋‹ค. 

 

๊ทธ๋ ‡๊ฒŒ ์‹คํ–‰ํ•œ์ง€ 15์‹œ๊ฐ„ ์ •๋„๊ฐ€ ์ง€๋‚˜๊ณ ... 

 

thread_1์ด ๋จผ์ € ์ž‘์—…์„ ๋‹ค ๋์„ ๋‚ด์„œ 1_rainbow_table.txt ํŒŒ์ผ์„ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค. ์šฉ๋Ÿ‰์€ 2.42GB์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ๋ฉ”๋ชจ์žฅ์œผ๋กœ ์—ด๋ฉด ์•ˆ ๋˜์„œ vim์œผ๋กœ ์—ด์–ด์ฃผ์—ˆ๋‹ค. 

 

 

 

๋ฌธ์ž๋ฅผ ์ฐพ์œผ๋ ค๋ฉด vim ์—๋””ํ„ฐ์—์„œ /(์Šฌ๋ž˜์‹œ)๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ์นœ๋‹ค.

๋‚˜ํ•œํ…Œ ์ฃผ์–ด์ง„ ํ•ด์‹œ ๊ฐ’์„ vim์— ์ž…๋ ฅ์„ ํ•ด์„œ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•„๋‚ด๋Š”๋ฐ ์„ฑ๊ณตํ•˜๊ณ 

 

์ž…๋ ฅ๋ž€์— ์ž…๋ ฅ์„ ํ–ˆ๋Š”๋ฐ!...

 

์„ธ์…˜์ด ๋๋‚˜์„œ ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ์„ ํ•ด๋‹ฌ๋ผ๊ณ  alert์ด ๋– ์„œ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์—ˆ๋‹ค..

 

๋‹น์—ฐํžˆ ํŒจ์Šค์›Œ๋“œ ํ•ด์‹œ๋Š” ๋ฐ”๊ปด์„œ ๋‹ค์‹œ ์‚ฌ์ „ ํŒŒ์ผ์˜ ์ƒˆ๋กœ์šด ํ•ด์‹œ์— ๋Œ€์‘ํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•„์ฃผ์—ˆ๋‹ค. 

 

๋‹ค์‹œ ํ•ด์‹œ ๊ฐ’์„ ์ฐพ์•„์„œ ์ž…๋ ฅ์„ ํ•ด๋ณธ๋‹ค. 

 

 

ํ˜น์‹œ๋‚˜ ์˜คํƒ€๊ฐ€ ์žˆ๋Š”๊ฐ€ ํ™•์ธ์„ ํ•˜๊ณ  ์ œ์ถœ!

 

 

old-04 Pwned!

 

ํ‘ธ๋Š”๋ฐ๋งŒ 15์‹œ๊ฐ„.. ์ •๋ง ๊ธธ๊ณ ๋„ ๊ธด ์‹œ๊ฐ„์ด์—ˆ๋‹ค... ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ๋งŽ์€ ์ผ์„ ์‹œํ‚จ ์ปดํ“จํ„ฐ๊ฐ€ ๋งŽ์ด ๊ฑฑ์ •์ด ๋œ๋‹ค. 

๋ฌผ๋ก  ์ง€๊ธˆ์€ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ”์ด ์žˆ์–ด์„œ ๋˜ ํ‘ธ๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง„ ์•Š๋Š”๋‹ค. 

 

728x90