NOT4DOG
방명록 RSS 태그 글쓰기 관리자
 
[CTF] CTF-D Find Password 문제 Write-up
CTF Write-up 2022-01-27 11:49:01

반응형

문제) Find Password, Hint : ALYSSA의 계정, KEY Format : Text

 

문제와 함께 SYSTEM 파일과 SAM 파일을 제공한다.

SAM 파일을 보자마자 NTLM Hash 값을 이용하면 될것이라는 생각이 든다.

 

SAM 파일이란? 보안 계정 관리자(SAM: Security Account Manager)는 윈도우 XP, 

윈도우 비스타 그리고 윈도우 7에서 사용자의 비밀번호를 저장하는 데이터베이스 파일이다.

이것은 사용자의 로컬(local) 또는 원격(remote) 인증에 사용된다.

SAM은 금지된 사용자가 시스템에 대한 접근을 획득하는 것을 막기 위해 암호화 방식을 사용한다.

사용자 비밀번호는 레지스트리 하이브에 LM 해시 포맷 또는 NTLM 해시 포맷으로 저장된다. 

 

SAM 파일로부터 NTLM 해시값을 알아내기 위해 Ophcrack을 사용하였다.

samdump2나 john the ripper를 사용해도 무방하다.

NTLM 해시값

 

얻은 해시값의 복호화를 위하여 제일 기본적인 온라인 해시 복호화 사이트를 사용했다.

https://hashes.com/en/decrypt/hash

 

Decrypt MD5, SHA1, MySQL, NTLM, SHA256, SHA512, Wordpress, Bcrypt hashes for free online

Hashes.com is a hash lookup service. This allows you to input an MD5, SHA-1, Vbulletin, Invision Power Board, MyBB, Bcrypt, Wordpress, SHA-256, SHA-512, MYSQL5 etc hash and search for its corresponding plaintext ("found") in our database of already-cracked

hashes.com

Ophcrack에서 얻은 해시값들을 Input값으로 넣고,

 

결과 값

총 두 계정의 text 패스워드 문자열을 찾을 수 있었다.

 

admin의 패스워드 : hahaha

byanca의 패스워드 : AngelHeart123456789

 

두 계정 중 admin의 패스워드로 FLAG를 입력하니 성공했다.

반응형


[CTF] CTF-D 제 친구의 개가 바다에서... 문제 Write-up
CTF Write-up 2022-01-26 23:01:03

반응형

문제) 제 친구의 개가 바다에서 수영을 하다가 플래그를 발견했는데 제게 주지 않습니다.

          여기서 구해 줄 수 있습니까?

 

CTF-D 문제는 예전에 대부분 풀어보았지만,

기억을 되살려 다시 공부도 할겸 한 문제씩 포스팅하려한다.'

 

CTF-D Scoreboard

 

우선 문제와 함께 hidden.jpg를 제공한다.

hidden.jpg

그림을 확인해보면 스테가노그래피 기법의 문제임을 짐작할 수 있다.

스테가노그래피란? 

스테가노그래피(steganography)는 전달하려는 기밀 정보를 파일, 메시지,

이미지 또는 비디오를 다른 파일, 메시지, 이미지 또는 비디오 안에 숨기는 심층 암호 기술이다.

 

스테가노그래피 문제는 여러가지 툴로 접근해볼 수 있는데 (openstego, OpenPuff 등)

나는 온라인 스테가노그래피 사이트를 사용했다.

https://incoherency.co.uk/image-steganography

 

Image Steganography

Each channel (red, green, blue) of each pixel in an image is represented by an 8-bit value. To hide the secret image inside the cover image, we replace the n least significant bits of the cover pixel value with the same number of most significant bits from

incoherency.co.uk

Unhide image 메뉴에서 hidden.jpg를 업로드하면 hidden bit 설정값에 따라

숨겨진 정보를 확인할 수 있다. 해독된 이미지를 다운로드해 살펴보면,

FLAG를 획득할 수 있다.

FLAG 획득

 

반응형


[CTF] Dreamhack devtools-sources 문제 Write-up
CTF Write-up 2022-01-24 21:22:57

반응형

문제) 개발자 도구의 Sources 탭 기능을 활용해 플래그를 찾아보세요.

 

문제만 보면 매우 간단한 문제임을 짐작할 수 있다.

문제와 함께 홈페이지의 소스들을 제공한다. 우선, 홈페이지에 접속해보자.

Main Page

 

여기서 F12 단축키를 사용해 웹 개발자 도구에 들어간다.

개발자 도구는 브라우저 마다 가지고 있는 기본적인 기능이지만, 강력한 Web Hacking 도구로도 사용할 수 있다.

개발자 도구 화면

 

코드를 확인한 결과, 반응형 웹 페이지의 탬플릿을 그대로 가져온 느낌이다.

JS, CSS 파일이 있고 각 파일마다 코드 라인 수도 상당해서 직접 하나하나 찾기에는 무리가 있다.

 

여기서 보통의 사람은 CTRL + F 에 익숙할 것이다. (문자열 검색 기본 단축키)

하지만, 파일의 개수가 많으므로 한 파일에서만 검색하는것은 시간 낭비이다.

 

Chrome 개발자 도구에서 전역 문자열 검색을 하는 단축키는

CTRL + SHIFT + F 이다.

이를 알고 있다면 시간 단축이 가능하다.

 

Dreamhack의 기본 FLAG 포맷은 DH{} 이므로 전역검색을 이용해 FLAG를 찾을 수 있다.

 

FLAG 획득

 

FLAG는 main.scss 파일 내부 FOOTER (마지막 부분) 4146번째 라인에 존재했다.

 

 

반응형


[CTF] Dreamhack session-basic 문제 Write-up
CTF Write-up 2022-01-23 18:07:59

반응형

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

 

로그인 페이지와 함께 app.py 를 제공한다.

Main Page

#!/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',
    'user': 'user1234',
    'admin': FLAG
}

session_storage = {
}


@app.route('/')
def index():
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html')

    return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')


@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')) )
            session_id = os.urandom(32).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'


@app.route('/admin')
def admin():
    return session_storage


if __name__ == '__main__':
    import os
    session_storage[os.urandom(32).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 

문제에서 admin 계정으로 로그인 해야 FLAG를 확인할 수 있다고 설명 되어있다.

코드를 분석하던 중 계정과 패스워드를 확인할 수 있었다. 

등록된 계정들의 ID/PW

당연하게도 admin 계정을 제외한 계정들만 패스워드가 평문으로 저장되어 있어, 

정상 로그인을 통한 admin 접근은 불가능한것으로 보인다.

문제에서 session값을 이용하라는 힌트를 주었으니, admin 계정의 session값을 알아내는 문제로 보인다.

 

코드를 분석하던 중, session_storage 라는 식별자를 발견했고,

session_storage의 정보는 root 내부 admin (/admin) 안에 들어있는것을 확인했다.

페이지 주소에 /admin을 더해 들어가 보았다.

http://host1.dreamhack.games:xxxxx/admin

 

{"3c7cd4bafdf5bd2bbce2a66a76b0f2f7980f99aef1011c3bbef95c1c45d3a3a5":"user",
"464b24591dc7ba5815647fd1ceb5b89f9a9f38b6312f1b6b5cb53f600c2824d9":"guest",
"b6664ceaad67f7803a06a2b34026652fbd259853f25c4d3cfaaa7d5d5e6dabcd":"admin"}

 

총 3개의 계정 (user, guest, admin)의 session값을 얻을 수 있다.

이를 변조하기 위해 Chrome의 개발자도구를 사용하였다.

user 계정으로 로그인한 session값

 

여기서 sessionidValue를 admin의 session값으로 변조해주면 된다.

FLAG 획득

반응형