본문 바로가기
분류 전/CTF

[b01lers CTF] warmup 풀이

by jwcs 2023. 3. 21.
728x90

http://ctf.b01lers.com:5115/aW5kZXguaHRtbA==

 

/

첫 화면이다. url 주소에 인코딩된 것처럼 보이는 것이 보인다. 디코딩 해보자.

 

index.html이라고 한다. 아직 무슨 힌트인지는 모르겠다. 

개발자 도구를 켜보자.

 

debug.html이 보인다. 아까 index.html이 인코딩 상태로 url에 들어갔으니 마찬가지로 debug.html을 인코딩하여 넣어보자.

 

debug.html을 인코딩하여 넣은 것이다. 이번엔 app.py가 보인다. 마찬가지로 인코딩하여 넣어보자.

 

결과다.

 

from base64 import b64decode 
import flask 
app = flask.Flask(__name__)
@app.route('/')
def index2(name): 
    name = b64decode(name) 
    if (validate(name)):
        return "This file is blocked!" 
    try: file = open(name, 'r').read() 
    except:
        return "File Not Found" 
    return file
@app.route('/') 
def index():
    return flask.redirect('/aW5kZXguaHRtbA==') 
def validate(data): 
    if data == b'flag.txt': 
        return True
    return False 
if __name__ == '__main__':
    app.run()

보기 쉽게 들여쓰기한 결과다. 코드를 해석해보자.

 

@app.route('/') 
def index():
    return flask.redirect('/aW5kZXguaHRtbA==')

매개변수를 받지 않는 index()함수 이다. index.html을 인코딩한 값을 넣어 재접속한다. 이렇게 되면 어떻게 될까?

 

@app.route('/')
def index2(name): 
    name = b64decode(name) 
    if (validate(name)):
        return "This file is blocked!" 
    try: file = open(name, 'r').read() 
    except:
        return "File Not Found" 
    return file

index2함수는 name이라는 변수를 받는다. 이 name 변수를 디코딩한다. 이 디코딩한 name변수를 validate이라는 함수에 넣는다. 이 함수가 무엇인지 확인해보자.

 

def validate(data): 
    if data == b'flag.txt': 
        return True
    return False

아까 입력한 name 변수를 data로 받는 모습이다. 이 data가 flag.txt인지 바이너리로 비교하고 있다.(블랙리스트<->화이트리스트) 만약 맞다면 true를 리턴하고 거짓이라면 false를 리턴한다. 

 

@app.route('/')
def index2(name): 
    name = b64decode(name) 
    if (validate(name)):
        return "This file is blocked!" 
    try: file = open(name, 'r').read() 
    except:
        return "File Not Found" 
    return file

 

다시 돌아왔다. validate()함수가 참이라면 어떻게 될까? "This file is blocked!"라는 말이 리턴된다.

false라면 name변수의 값과 같은 이름의 파일을 열어 file 변수에 담는다. 없는 파일이 아니라면 이것을 리턴하다.

 

종합하자면 name은 flag.txt라는 이름을 가지고 있어야 한다. 하지만 이것이 validate함수가 flag.txt를 필터링한다. 이것을 어떻게 우회해야 할까?

 

디렉터리 트레버셜 공격을 아는가?

상대경로로 ../../../로 이동해서 원하는 파일로 침투하는 공격이다. 이를 활용한다면 이 문제를 풀 수 있다.

 

./flag.txt를 한다면 flag.txt와 다르지만 flag.txt를 가져올 수 있다. 

./flag.txt를 인코딩하여 url에 넣어보자.

 

 

짜잔

728x90
반응형

'분류 전 > CTF' 카테고리의 다른 글

[ASIS] hello 풀이  (2) 2023.10.02
[WACON2023] mosaic  (0) 2023.09.05
[WACON2023] mic check 풀이  (0) 2023.09.05
[Wolve CTF 2023] Zombie 101 풀이  (0) 2023.03.21
[WolvCTF 2023] Charlotte's Web 풀이  (0) 2023.03.20