[DreamHack] [web] [LEVEL 1] BypassIF 풀이

2024. 11. 19. 12:35Information Security 정보보안/DreamHack

728x90


배울내용 

dreamhack,

web hacking,

개발자도구,

dreamhack 풀이,

dreamhack BypassIF  문제,

dreamhack web 풀이 ,

burfsuite, 

Timeout,

BypassIF

 

 

문제

 

 

 

문제설명에 의하면 Admin 의 키를 입력하면 성공 플레그를 뛰울수있을것같다

 

 

 

 

flag 라는 함수에 Post 로 전송이 되며  입력값으로는 A~Z , a~z 또는 0~9 로 되있는 문자열이 최소 2~ 35개 까지가 들어가야하는걸로 보인다 아마 코드를 확인해봐야할것같다 

 



@app.route('/flag', methods=['POST'])
def flag():
     # POST request
    if request.method == 'POST':
        key = request.form.get('key', '')
        cmd = request.form.get('cmd_input', '')
        if cmd == '' and key == KEY:
            return render_template('flag.html', txt=FLAG)
        elif cmd == '' and key == guest_key:
            return render_template('guest.html', txt=f"guest key: {guest_key}")
        if cmd != '' or key == KEY:
            if not filter_cmd(cmd):
                try:
                    output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
                    return render_template('flag.html', txt=output.decode('utf-8'))
                except subprocess.TimeoutExpired:
                    return render_template('flag.html', txt=f'Timeout! Your key: {KEY}')
                except subprocess.CalledProcessError:
                    return render_template('flag.html', txt="Error!")
            return render_template('flag.html')
        else:
            return redirect('/')
    else: 
        return render_template('flag.html')

 

코드를 뜯어보니 위와 같이 /flag 가 실행 될때  입력한 값이 key 로 들어가는 걸 볼수있고 중간에 filter_cmd 함수를 봐도 flag , cat , chmod, head, tail , grep 등 취약한 함수를 필터링 하고 또한 ascii 로 변경해서 쓸수없에 not in alphabet 을 사용한것도 볼수있다. 

 

또한 코드를 잘 보면 timeout이 발생하면 flag가 출력된다. 이제 timeout을 일으키는 쪽으로 생각 해보자.

 

# filtering
def filter_cmd(cmd):
    alphabet = list(string.ascii_lowercase)
    alphabet.extend([' '])
    num = '0123456789'
    alphabet.extend(num)
    command_list = ['flag','cat','chmod','head','tail','less','awk','more','grep']

    for c in command_list:
        if c in cmd:
            return True
    for c in cmd:
        if c not in alphabet:
            return True

 

 

그러면 이걸 어떻게 뚫을수있을까? 

일단 request 에 맞게 key 외에 cmd_input 이 없는걸 알수있다 그래서 burfsuite 로 이용하여 request 에 cmd_input 을 넣어서 Forward 시켜 보자

 

 

 

기존에 key=ss 에 되있는거 &cmd_input=ls 을 추가해서 전송시켰더니 아래처럼 나왔다

 

 

기존에 key 로만존재했던게 cmd_input 으로 바뀌어져있었고 다시 ls 를 입력하니 아래와 같이 5개 파일을 볼수있었는데 여기서 기존에 filtering 되는걸 알수있기에 특수문자를 바꿔도 소용이 없다 그러면 아까 조건문을 잘생각해봐야한다

TimeOut 을 이용하면 key 를 얻을수있기에 sleep 명령어를 써서 시간을 늘리면 TimeOut 이 발생할것으로 보고 sleep 10를 입력해본다

 

 

 

그러면 약 10초 정도 기다리면 Key 값을 받게 되고 기존화면으로 돌아와서 그 키 값을 입력하면 성공적으로 성공플레그를 뛰울수있게 된다 

 

 

728x90