2024. 11. 19. 12:35ㆍInformation Security 정보보안/DreamHack
배울내용 :
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 값을 받게 되고 기존화면으로 돌아와서 그 키 값을 입력하면 성공적으로 성공플레그를 뛰울수있게 된다
'Information Security 정보보안 > DreamHack' 카테고리의 다른 글
[DreamHack] [web] [LEVEL 1] Type c-j 풀이 (1) | 2024.11.21 |
---|---|
[DreamHack] [web] [LEVEL 1] baby-union 풀이 (1) | 2024.11.20 |
[DreamHack] [web] [LEVEL 1] what-is-my-ip 풀이 (0) | 2024.11.18 |
[DreamHack] [web] [LEVEL 1] access-log 풀이 (1) | 2024.11.17 |
[DreamHack] [web] [LEVEL 1] simple-phparse 풀이 (1) | 2024.11.17 |