오랜만에 게시글 포스팅합니다.
마지막 블로그 글 이후에 모의해킹 강의도 듣고 이것저것 공부하는데 벌써 몇달이 흘러버렸네요,, 다시 제가 공부하는 것들 해킹 관련된 문제 Write-Up 등등 다양하게 다시 포스팅 할 예정입니다. 다시 한번 잘 부탁 드리겠습니다.

Carve-Party

할로윈 파티를 기념하기 위해 호박을 준비 했다고 한다. 호박을 10000번 클릭하면 플래그를 획득할 수 있다.

문제를 다운받고 접속하면 아주 귀여운 호박이 우릴 맞이해준다ㅋㅋㅋ

 

 

이 호박은 누를때 마다 10000에서 -1 씩 카운트가 줄어든다.
페이지 소스에서 자바스크립트 코드를 확인한 결과 길고 복잡한 코드들이 나오는데 그중에서 중점적으로 봐야할 코드를 아래에 적어놓았다.

$(function() {
  $('#jack-target').click(function () {
    counter += 1;
    if (counter <= 10000 && counter % 100 == 0) {
      for (var i = 0; i < pumpkin.length; i++) {
        pumpkin[i] ^= pie;
        pie = ((pie ^ 0xff) + (i * 10)) & 0xff;
      }
    }
    make();
  });

이 코드를 중점적으로 봐야하는 이유 바로 $('#jack-target').click() 함수를 for 문을 이용해서 10000번의 클릭을 할것이기 때문이다.


생각해보면 아주아주 간단한 문제이다. 사실 문제를 보자마자 for 문을 사용해서 10000번 클릭을 하면 되려나 하는 생각이 들었다. 반복하면 대표적인것이 for 문이라서 그런가보다.

 

 

그래서 간단한 for 문을 작성해보았다. 아래는 내가 작성한 코드이다

for(i = 0; i <= 10000; i++){
    $('#jack-target').click()
}

그렇다. 아주 간단하다 이 코드를 검사(F12) -> console에 붙여넣기 하면 우리에게 플래그 값을 줄것이다.

 

 

 

flag 획득 완료!

'Dreamhack' 카테고리의 다른 글

[Dreamhack] xss-1 Write-Up  (0) 2024.03.18
[Dreamhack] session-basic Write-Up  (0) 2024.03.16
[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15

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

 

xss-1

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다. 문제 수정 내역

dreamhack.io

 

문제

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

플래그 형식은 DH{...} 입니다.


풀이

 

1.  이 문제는 Flask 프레임워크로 구성, XSS를 통해 다른 이용자의 쿠키를 탈취해야하기 때문에, 다른 이용자가 방문하는 시나리오가 필요하기 때문에 셀레늄을 통해서 구현이 되어있다

 

2. 코드 분석

 

  • /vuln
# vuln 페이지를 구성하는 코드, 이용자가 전달한 param 파라미터 값을 출력
@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져온다
    return param # 이용자의 입력값을 화면 상에 표시

 

  • /memo
# 이용자가 전달한 memo 파라미터 값을 render_template 함수를 통해 기록하고 출력
@app.route("/memo") # memo 페이지 라우팅
def memo(): # memo 함수 선언
    global memo_text # 메모를 전역변수(global)로 참조
    text = request.args.get("memo", "") # 이용자가 전송한 memo 입력값을 가져옴
    memo_text += text + "\n" # 이용자가 전송한 memo 입력값을 memo_txt에 추가
    return render_template("memo.html", memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력

 

  • /flag
# POST => params 파라미터에 값과 쿠키에 FLAG를 포함해서 chech_xss 함수를 호출한다, check_xss는 read_rul 함수를 호출해 vuln 엔드포인트에 접속
def read_url(url, cookie={"name": "name", "value": "value"}):
    cookie.update({"domain": "127.0.0.1"})
    try:
        service = Service(executable_path="/chromedriver")
        options = webdriver.ChromeOptions()
        for _ in [
            "headless",
            "window-size=1920x1080",
            "disable-gpu",
            "no-sandbox",
            "disable-dev-shm-usage",
        ]:
            options.add_argument(_)
        driver = webdriver.Chrome(service=service, options=options)
        driver.implicitly_wait(3)
        driver.set_page_load_timeout(3)
        driver.get("http://127.0.0.1:8000/")
        driver.add_cookie(cookie)
        driver.get(url)
    except Exception as e:
        driver.quit()
        # return str(e)
        return False
    driver.quit()
    return True
    
    
def check_xss(param, cookie={"name": "name", "value": "value"}):
    url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
    return read_url(url, cookie)
    
@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html")
    elif request.method == "POST":
        param = request.form.get("param")
        if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'

 

 

3. 취약점 분석

vuln과 memo 엔드포인트는 이용자의 입력값을 페이지에 출력한다

memo는 render_template 함수를 이용해 memo.html을 출력 -> render_template 함수는 전달된 템플릿 변수를 기록 할 때마다 HTML 엔티티코드로 변환해 저장하기 때문에 XSS가 발생하지 않는다

그러나 vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 XSS가 발생.

 

4. exploit

  • /vuln 엔드포인트에서 발생하는 XSS 취약점을 통해 임의의 이용자 쿠키를 탈취
  • 탈취한 쿠키를 전달받기 위해서는 외부에서 접근가능한 웹서버를 사용하거나 memo 엔드포인트 사용
  • 공격에 사용할 수 있는 속성
  • -> location.href : 전체 URL을 번환하거나, URL을 업데이트할 수 있는 속성 값
  • -> document.cookie : 해당 페이지에서 사용하는 쿠키를 읽고, 쓰는 속성 
  • flag 페이지에 들어가 <script>location.href = "/memo?memo=" + document.cookie;</script>를 입력한다

  • 입력한 후에 memo로 들어가면 flag가 찍혀 있는 모습을 확인 할 수 있다. 

 

 

5. 이러한 문제를 해결하는 방법

XSS 공격은 서버에서 이용자의 입력값을 별다른 검증없이 페이지에 출력할 경우 발생할 수있는 문제점이다

주로, 이용자의 입력값이 출력되는 페이지에서 발생하며, 해당 공격으로 타 이용자의 브라우저에 저장된 쿠키 및 세션 정보를 탈취할 수 있기 때문에

 

악성태그를 필터링하는 HTML Sanitization을 사용하거나 엔티티 코드로 치환하는 방법을 사용하면 문제 해결이 가능하다

 

'Dreamhack' 카테고리의 다른 글

[Dreamhack] Carve_Party WriteUp  (0) 2024.06.11
[Dreamhack] session-basic Write-Up  (0) 2024.03.16
[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15

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

 

session-basic

Description 쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. 플래그 형식은 DH{...} 입니다. Reference Background: Cook

dreamhack.io

 

문제 


쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다.admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.
플래그 형식은 DH{...} 입니다.


 



풀이

 

 

1. 취약점 파악

@app.route('/admin')
def admin():
    # developer's note: review below commented code and uncomment it (TODO)

    #session_id = request.cookies.get('sessionid', None)
    #username = session_storage[session_id]
    #if username != 'admin':
    #    return render_template('index.html')

    return session_storage


if __name__ == '__main__':
    import os
    # create admin sessionid and save it to our storage
    # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
    session_storage[os.urandom(32).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 

이전에 풀었던 cookie 문제와 코드는 비슷한데 새로 추가된 다른 가장 중요한 취약점이라고 생각되어 위 코드 부분만 설명하고 바로 exploit 하겠습니다

  • cookie는 클라이언트가 인증을 하는 것이고 session은 서버에서 인증하는 것을 준다고 생각하면 쉽다
  • admin의 session 생성에 대해선 os.urandom(32).hex()를 통해서 무작위 랜덤 값이 생성되고 username이 admin인 세션 정보를 session_storage에 추가된다
  • 이 session_storage의 정보를 조회 할 수 있다면 무작위로 생성된 값을 계산하거나 어렵게 하지 않고, sessionid 값을 바로 획득가능하다
  • @app.route('/admin') 부분을 보면 /admin 라는 엔드포인트로 접근이 가능하다는 것인데 return 값으로 session_strorage 라고 나와있다 
  • 원래는 admin 권한을 가지고 있는 사용자만 접속이 가능한데 주석처리가 되어있으므로 누구든지 들어갈 수 있게 되었다
  • 그렇다면 주소창 끝에 /admin을 넣어 보면 뭔가 나오지 않을까!!
  • 이렇게 취약점을 찾았고 이제는 exploit을 해보자

 

2. exploit

그리고 cookie 와 동일하게 guest라는 id도 있고, 새로 추가된 user라는 id도 있으니 참고해서 사용하면 좋을 듯 하다

 

우선 guest user로 로그인해서 동작 확인을 하고 sessionid를 잘 만들어 주는지 확인한다

 

이후 취약점에서 파악 했던 /admin을 주소창에 추가한다

 

빙고!! admin의 sessionid 값이 session_storage에 저장이 되어있다

 

저 sessionid와 username을 검사 application에서 수정 및 추가해준다

 

추가 해준 뒤에 새로고침을 하면 admin으로 로그인이 되고 flag를 획득 할 수 있게 된다

 

 

 

 

FLAG

DH{8f3d86d1134c26fedf7c4c3ecd563aae3da98d5c}

'Dreamhack' 카테고리의 다른 글

[Dreamhack] Carve_Party WriteUp  (0) 2024.06.11
[Dreamhack] xss-1 Write-Up  (0) 2024.03.18
[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15

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

 

cookie

쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. 플래그 형식은 DH{...} 입니다. Reference Introduction of Webhacking

dreamhack.io

 

문제

쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.

플래그 형식은 DH{...} 입니다.

 

 

 


 

풀이

 

1. 문제를 다운 받고 app.py 코드를 확인한다

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',
    'admin': FLAG
}

@app.route('/')
def index():
    username = request.cookies.get('username', None)
    if username:
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            resp.set_cookie('username', username)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

app.run(host='0.0.0.0', port=8000)

 

flask로 이루어진 코드를 확인 할 수 있다.

 

flask 코드를 볼 줄 알아야 그래도 문제를 이해하고 풀 수 있다

 

 

 

2. 취약점 분석

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',
    'admin': FLAG
}

@app.route('/')
def index():
    username = request.cookies.get('username', None)
    if username:
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
    return render_template('index.html')

 

처음 중점적으로 봤던 부분은 users 부분이다.

  • admin 뿐만 아니라 guest 라는 user도 있다
  • guest라는 user로 로그인하면 guest라는 쿠키를 얻는다
  • 하지만 guest라는 계정으로 로그인하면 you are not admin이라는 문구를 띄운다
  • admin 계정으로 로그인하면 Hello admin flag is DH{..} 이런식으로 flag 를 띄어주는 것같다
  • flag는 ./flag.txt. 파일을 열어서 읽어준다

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            resp.set_cookie('username', username)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

app.run(host='0.0.0.0', port=8000)

 

  • /login 이라는 경로에서 일어나는 http method에 관해서 적혀있다
  • cookie가 생성되는 방식에 대해서는 여기서 다시 나와있다 key value로 저장이 되는데 guest로 로그인시 key = username, value = guest 가 되는 것이다. 
  • 이미 정답을 알지 않았는가??
  • 저 코드에 의하면 key=username 이고 value가 username에 따라서 바뀐다면 admin으로 바뀌면 문제가 풀릴 것이다.
  • 코드를 보고 문제의 가닥을 잡았으니 진짜 문제를 풀어보자

 

3. exploit

 

주어진 웹해킹 사이트에 접속해 검사에서 Network 부분이 나오게 한다

이후에 알고 있는 guest 아이디로 로그인한다

 

 

 

역시 guest로 로그인하면 너는 admin이 아니다 라는 문구와 함께 검사창에 Set-Cookie 가 남는 모습을 확인할 수 있다

 

Application 부분에서 Key(Name) 부분은 역시 username 으로 Value 부분에는 guest로 나온다 코드에서 본것과 같이 나오는 모습이다 그럼 이제 value 부분을 admin으로 변경 후에 새로고침을 해보자

새로고침을 하니 자동으로 admin 계정으로 로그인이 되고 flag 값을 출력하는 것을 확인 할 수 있다.

 

 

 

 

 

 

FLAG

DH{7952074b69ee388ab45432737f9b0c56}

'Dreamhack' 카테고리의 다른 글

[Dreamhack] xss-1 Write-Up  (0) 2024.03.18
[Dreamhack] session-basic Write-Up  (0) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15
[Dreamhack] blue-whale Write-Up  (3) 2024.03.15

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

 

phpreg

Description php로 작성된 페이지입니다. 알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다. Step 2에서 system() 함수를 이용하여 플래그를 획득하세요. 플래그는 ../dream/flag.txt에 위치합니

dreamhack.io

 

문제

php로 작성된 페이지입니다.
알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다.
Step 2에서 system() 함수를 이용하여 플래그를 획득하세요.
플래그는 ../dream/flag.txt에 위치합니다.
플래그의 형식은 DH{...} 입니다.

 

 

풀이

 

1.  서버를 생성한 후에 웹해킹 링크로 들어간다.

 

 

2. 문제 파일을 받아 index.php 와 step2.php 를 확인한다. index.php를 보면 크게 얻어갈 단서는 없는 듯 하고 step2.php에서 본격적인 단서 들이 나온다

      <?php
          // POST request
          if ($_SERVER["REQUEST_METHOD"] == "POST") {
            $input_name = $_POST["input1"] ? $_POST["input1"] : "";
            $input_pw = $_POST["input2"] ? $_POST["input2"] : "";

            // pw filtering
            if (preg_match("/[a-zA-Z]/", $input_pw)) {
              echo "alphabet in the pw :(";
            }
            else{
              $name = preg_replace("/nyang/i", "", $input_name);
              $pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
              
              if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
                echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';

 

유심히 봐야할 코드만 추려서 올렸다.

 

  • 단서1 : pw filtering이 걸려있다 "/[a-zA-z]/" 알파벳을 pw로 적을 시 alphabet in the pw :( 라는 문구가 떨어진다

  • 단서2 : prge_replace 로 인해 "/nyang/i" "" nyang 이라는 문자열이 인식이 되면 빈 공백으로 replace 되는 코드가 보인다 
  • 단서3 : 정규 표현식 ("/\d*\@\d{2,3}(31)+[^0-8\"]\!/"을 입력하게 되면 -> "d4y0r50ng" 이런 문자열로 replace되는 점
  • 단서4 : name은 dnyang0310 이 되어야하고 pw는d4y0r50ng+1+13 이런 형식으로 되어야 step2로 넘어갈 수 있다

 

이 단서들을 활용하여 문제를 풀면된다 단서4 에서 d4y0r50ng+1+13 이것은 큰 따옴표에 묵여있기 때문에 113 이 아니라 "+1+13" 그대로 입력을 해야한다.

 

 

 

 

3. 단서를 이용해서 해석한 후에 문제를 풀어보자

  • 우선 name에 대한 부분이다
    • /i => 대소문자를 무시하는 플래그 
    • nyang를 입력하면 공백("")으로 인식하니  출력이 정답에 맞게 적어주면 된다 
    • dnyangnyang0310 -> replace 되면 d0310 이 된다
    • dnynyangyang0310 -> replace 되면 dnyang0310 정답이다!
  • pw 정규 표현식 해석
    • \d* => 0개 이상의 숫자
    • \@ => @
    • \d{2,3}(31) => 2~3자리 숫자 후에 31이 오면 된다
    • +[^0-8\"] => ^표시는 뒤에 주어진 값을 제외하고 라는 뜻이므로 0~8 그리고 " 를 제외한 나머지 문자
    • \! => 마지막은 !로 나와야한다
    • 이렇게 정규식에 맞게 적는다면 보이진 않지만 d4y0r50ng 로 replace 될것이고 마지막으로 뒤에 +1+13을 적어주면 된다
    • 123@31319!+1+13
    • 123@54319!+1+13
    • 여러 가지로 pw를 테스트 해보았다. 

4. step2 

step2에서는 flag를 찾으면 된다 step2.php 코드를 보면 cmd filtering도 되어있다.

// cmd filtering
                else if (preg_match("/flag/i", $cmd)) {
                  echo "<pre>Error!</pre>";
                }
                else{
                  echo "<pre>--Output--\n";
                  system($cmd);
                  echo "</pre>";
                }

 

cmd filtering은 flag 라는 문자를 대소문자 구분 없이 사용한다면 Error! 라는 출력 값을 우리에게 선사한다

하지만 이미 문제에서 flag 경로를 우리에게 알려주었다

 ../dream/flag.txt 이 경로에 있다고 한다.

cat ../dream/f?ag.txt 또는 cat ../dream/*.txt  를 사용하여 직접적인 flag를 적지 않고도 다양한 방법으로 flag를 획득할 수 있다

 

 

 

 

 

 

 


DH{ad866c64dabaf30136e22d3de2980d24c4da617b9d706f81d10a1bc97d0ab6f6}

 

 

flag 획득!!

 

'Dreamhack' 카테고리의 다른 글

[Dreamhack] session-basic Write-Up  (0) 2024.03.16
[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15
[Dreamhack] blue-whale Write-Up  (3) 2024.03.15
[Dreamhack] baby-linux Write-Up  (1) 2024.03.14

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

 

ex-reg-ex

Description 문제에서 요구하는 형식의 문자열을 입력하여 플래그를 획득하세요. 플래그는 flag.txt 파일과 FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다.

dreamhack.io

 

문제

문제에서 요구하는 형식의 문자열을 입력하여 플래그를 획득하세요. 플래그는 flag.txt 파일과 FLAG 변수에 있습니다.

플래그 형식은 DH{...} 입니다.


 

 



풀이

1. 정규표현식 문제이다 문제를 다운 받으면 python 코드를 보여주고 웹해킹 문제 사이트에 들어가서 문제를 풀면된다

지급된 웹해킹 링크

#!/usr/bin/python3
from flask import Flask, request, render_template
import re

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"

@app.route("/", methods = ["GET", "POST"])
def index():
    input_val = ""
    if request.method == "POST":
        input_val = request.form.get("input_val", "")
        m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)
        if m:
            return render_template("index.html", pre_txt=input_val, flag=FLAG)
    return render_template("index.html", pre_txt=input_val, flag='?')

app.run(host="0.0.0.0", port=8000)

이러한 코드를 지급해준다.

 

2. 집중해서 봐야할 부분은 `dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+` 이부분이다

@가 있는걸 봐서는 이메일을 만드는 정규표현식 인것같다 해석을 해보자면

 

  •  처음 시작은 dr 로 시작을 해야한다
  • \w{5,7} => 5~7개의 알파벳 또는 숫자가 온다
  • 다음은 e
  • \d+ =>하나 이상의 숫자가 온다
  • 다음은 am@
  • [a-z]{3,7} => 소문자 알파벳 3~7개
  • 다음은 \. => 무조건 .
  • \w+ => 하나 이상의 알파벳 또는 숫자가 온다

 

정규표현식 문제이기 때문에 정해져있는 틀에서 벗어나지 않는다면 다 정답이 될것이다.

 

나는 drabcdee145am@abcedf.12345 를 했는데 flag를 받았다

래도 이메일 형식을 하면 좋으니

 

drjeffkime0315@tistory.com 으로 해보았다 역시 flag는 준다

'Dreamhack' 카테고리의 다른 글

[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] blue-whale Write-Up  (3) 2024.03.15
[Dreamhack] baby-linux Write-Up  (1) 2024.03.14
[Dreamhack] 64se64 Wirte-Up  (0) 2024.03.14

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

 

blue-whale

Description 보코가 여러분에게 도움을 요청합니다. "분명 플래그 파일이 있었는데요... 없어졌어요." Docker hub의 dreamhackofficial/blue-whale 레포지토리 (TAG:1) 에서 도커 이미지를 다운받을 수 있습니다.

dreamhack.io

 

문제

보코가 여러분에게 도움을 요청합니다. "분명 플래그 파일이 있었는데요... 없어졌어요."

Docker hub의 dreamhackofficial/blue-whale 레포지토리 (TAG:1) 에서 도커 이미지를 다운받을 수 있습니다. 도커 이미지를 분석하여 플래그를 획득하세요.
주어진 Dockerfile은 이미지를 빌드할 때 사용한 파일로, 풀이자가 사용할 수 없습니다.

플래그 형식은 DH{...} 입니다.


Hint: https://github.com/wagoodman/dive

 

 


풀이

 

1. 문제 요청대로 dockerhub에 올라가 있는 dreamhackofficial/blue-whale:1를 pull해준 후에 image 확인

sudo docker pull dreamhackofficial/blue-whale:1

sudo docker images

 

sudo docker inspect 로 확인했는데 별 다른 이상한점 없음

 

2. pull 받은 image 분석을 해야하는데 dive 라는 분석 툴을 이용하여 dockerfile에 적혀있는 것을 확인할 것이다.

hint 사이트에 들어가 dive를 다운 받아 준다. 우분투를 사용하기 때문에 deb를 다운받는다

DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb
sudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb

sudo dive -version

 

다운 받고 난 이후 잘 다운이 받아졌는지 확인 

 

3. 분석해야할 image와 tag를 적어 분석 화면으로 들어간다.

dive

sudo dive dreamhackofficial/blue-whale:1

 

4. 우선 dockerfile의 layer를 선택한 후에 switch view를 한 후에 flag 를 획득 한다

flag 파일 copy 되어 잘 들어감 -> python을 통해서 flag 파일을 읽고 print한 layer가 보인다 -> 하지만 뒤에 rm * 로 flag를 지워버렸다

 

이것을 찾기 위해서 layer를 화살표로 밑으로 이동해서 확인한다

 

그리고 tab키를 눌러서 view를 스위치 한 후에 디렉터리 항목들을 봐야하는데 너무 많은 디렉터리가 있어서 일단 전부다 축소를 해야한다

전부다 축소하기 위해서 단축키 `ctrl + space` 를 해준 다음 아까 layer에서 RUN /bin/sh -c touch `python3 -c "print(open('./flag', 'r').read())"` # buildkit  이 부분을 선택했기 때문에 flag가 이렇게 나온 모습을 볼 수 있다 

하지만 옆 부분이 짤리기 때문에 단축키 `ctrl + b` 를 이용하여 attributes를 해제 해주면

이렇게 flag 획득이 가능하다

 

단축키를 잘 활용하여 dockerfile에 쌓인 layer가 변하는 모습을 확인하여 flag가 삭제되기 이전의 모습과 삭제된 후를 확인 할 수 있다

힌트도 잘 활용하자~~

'Dreamhack' 카테고리의 다른 글

[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15
[Dreamhack] baby-linux Write-Up  (1) 2024.03.14
[Dreamhack] 64se64 Wirte-Up  (0) 2024.03.14

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

 

baby-linux

Description 리눅스 명령어를 실행하는 웹 서비스가 작동하고 있습니다. 해당 웹 서비스의 코드가 첨부파일로 주어집니다. flag.txt 파일을 찾아 출력하여 플래그를 획득하세요! 플래그 형식은 DH{...}

dreamhack.io

 

문제

리눅스 명령어를 실행하는 웹 서비스가 작동하고 있습니다.
해당 웹 서비스의 코드가 첨부파일로 주어집니다.

flag.txt 파일을 찾아 출력하여 플래그를 획득하세요!

플래그 형식은 DH{...} 입니다.


 

 

풀이 및 정답

 

 

 

1. 주어진 해당 웹 사이트에 접속한다. (웹 해킹 사이트에서 사용한 코드파일은 홈페이지에서 주니깐 다운 받아서 확인)

 

이 웹사이트는 리눅스 명령어를 실행 할 수 있는 웹서비스가 작동하는 것이다.

해린이다보니깐 처음에 문제를 보고 주어진 코드도 봤지만 도통 어떻게 풀어야하는 건지 삽질을 많이 했다.

 

일단 flag.txt 를 찾는 것이라서 echo 부분에 flag.txt 라고 치니 No!! 라는 Result가 떳다. 그래서 flag란 단어가 들어가면 No라는 결과를 출력 한다는 단서 하나를 얻었다.

 

 

2.  두번째 단서

리눅스 환경에서 echo를 치고 옆에 글씨를 넣으면 입력받은 대로 출력을 해준다. 여기서는 echo$() 라고 나와있는데 

일반 쉘프롬프트에다가 없는 명령어를 치면 command not found 에러가 발생하듯이 똑같이 echo$() 빈 공백에 없는 명령어를 치면 역시나 command not found가 뜬다.

사용 가능한 명령어는 변수로 설정이 되어있다는 뜻이다!! /usr/bin 디렉터리에 등록되어있는 변수 명령어 들이 동작이 되는 것이다.

 

 

3. 세번째 단서

생각에 생각을 하다가 두번째 단서를 얻고 나서 웹사이트에다가 ls를 치니 무언가 반응을 했다.

Result에 결과가 떳다!! 이제 끝났다고 보면된다.

 

호기심에 find 명령어나 cd 명령어를 쳐봤는데 Result 결과 값이 안나오는 것을 보고 ls 명령어를 쳐서 찾아야 한다는 것을 깨달았다.

 

4. 마무리 및 정답 

몇개 없는 디렉터리라 정말 금방 찾았다.

첫번째 단서에서 얻었던 flag 라는 단어를 쓰면 No!를 Result 하는 것을 알았으니 마지막 flag.txt 경로를 찾고

와일드 카드를 이용해서 파일의 내용, flag를 획득했다.

정답 사용 명령어

cat ./dream/hack/hello/*.txt




---
flag.txt

DH{671ce26c70829e716fae26c7c71a33823feb479f2562891f64605bf68f60ae54}

 

 

'Dreamhack' 카테고리의 다른 글

[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15
[Dreamhack] blue-whale Write-Up  (3) 2024.03.15
[Dreamhack] 64se64 Wirte-Up  (0) 2024.03.14

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

 

64se64

Description "Welcome! 👋"을 출력하는 html 페이지입니다. 소스 코드를 확인하여 문제를 풀고 플래그를 획득하세요. 플래그 형식은 DH{...} 입니다.

dreamhack.io

문제


"Welcome! 👋"을 출력하는 html 페이지입니다.

소스 코드를 확인하여 문제를 풀고 플래그를 획득하세요.
플래그 형식은 DH{...} 입니다.


 

풀이
1. 문제에서 주어진 웹사이트 접속

문제에서 주어진 웹해킹 문제 사이트 접속 화면









2. Ctrl+U 또는 마우스 오른쪽 클릭 후 페이지 소스보기 클릭

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Welcome</title>
</head>

<body>
  <h1>Welcome! 👋</h1>
  <form method="POST">
    <input type="hidden" name="64se64_encoding" value="IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwphc2M
    9WzY4LCA3MiwgMTIzLCA5OCwgMTAxLCA0OCwgNTIsIDU0LCA5OCwgNTUsIDUzLCA1MCwgNTAsIDk3LCA5NywgN
    TAsIDEwMSwgNTAsIDU2LCAxMDIsIDUwLCA1NSwgNTQsIDEwMSwgNDgsIDk5LCA1NywgNDksIDQ4LCA1MywgNTA
    sIDQ5LCAxMDIsIDUwLCA1MSwgOTcsIDQ4LCA1MywgNTYsIDU1LCA0OCwgNDgsIDUzLCA5NywgNTYsIDUxLCA1NS
    wgNTUsIDUxLCA1NSwgNDgsIDk3LCA0OSwgNDksIDEwMSwgNTMsIDEwMSwgNTIsIDEwMCwgOTksIDQ5LCA1MywgMT
    AyLCA5OCwgNTAsIDk3LCA5OCwgMTI1XQphcnI9WzAgZm9yIGkgaW4gcmFuZ2UoNjgpXQpmb3IgaSBpbiByYW5nZS
    gwLDY4KToKICAgIGFycltpXT1jaHIoYXNjW2ldKQpmbGFnPScnLmpvaW4oYXJyKQpwcmludChmbGFnKQ==">
  </form>
</body>
</html>

 

 

 

3. value 부분에 base64 방식으로 인코딩 되어있는 코드를 디코딩 시킨 후 결과 값 확인

echo "IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwphc2M9WzY4LCA3MiwgMTIzLCA5OCwgMTAxLCA0OCwgNTIsIDU0LCA5OCw
gNTUsIDUzLCA1MCwgNTAsIDk3LCA5NywgNTAsIDEwMSwgNTAsIDU2LCAxMDIsIDUwLCA1NSwgNTQsIDEwMSwgNDgsIDk5
LCA1NywgNDksIDQ4LCA1MywgNTAsIDQ5LCAxMDIsIDUwLCA1MSwgOTcsIDQ4LCA1MywgNTYsIDU1LCA0OCwgNDgsIDUzL
CA5NywgNTYsIDUxLCA1NSwgNTUsIDUxLCA1NSwgNDgsIDk3LCA0OSwgNDksIDEwMSwgNTMsIDEwMSwgNTIsIDEwMCwgOT
ksIDQ5LCA1MywgMTAyLCA5OCwgNTAsIDk3LCA5OCwgMTI1XQphcnI9WzAgZm9yIGkgaW4gcmFuZ2UoNjgpXQpmb3IgaSB
pbiByYW5nZSgwLDY4KToKICAgIGFycltpXT1jaHIoYXNjW2ldKQpmbGFnPScnLmpvaW4oYXJyKQpwcmludChmbGFnKQ=="
| base64 --decode > flag


---
cat flag

#!/usr/bin/env python3
asc=[68, 72, 123, 98, 101, 48, 52, 54, 98, 55, 53, 50, 50, 97, 97, 50, 
101, 50, 56, 102, 50, 55, 54, 101, 48, 99, 57, 49, 48, 53, 50, 49, 102, 
50, 51, 97, 48, 53, 56, 55, 48, 48, 53, 97, 56, 51, 55, 55, 51, 55, 48, 
97, 49, 49, 101, 53, 101, 52, 100, 99, 49, 53, 102, 98, 50, 97, 98, 125]
arr=[0 for i in range(68)]
for i in range(0,68):
    arr[i]=chr(asc[i])
flag=''.join(arr)
print(flag)

 

출력 결과물 확인 시 python 코드가 출력되는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

4.  디코딩한 출력 결과물 python 으로 실행

python flag




DH{be046b7522aa2e28f276e0c910521f23a0587005a8377370a11e5e4dc15fb2ab}

 

DH{..} 형식의 플래그 출력

 

 

 

'Dreamhack' 카테고리의 다른 글

[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] phpreq Write-Up  (2) 2024.03.15
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15
[Dreamhack] blue-whale Write-Up  (3) 2024.03.15
[Dreamhack] baby-linux Write-Up  (1) 2024.03.14

+ Recent posts