반응형

특정host에 ping패킷을 보내는 서비스라고 하고, 운영체제 명령어 삽입을 통해 플래그를 획득할 수 있다고 합니다.

플래그는 flag.py 에 있고, 뭔가 명령어 삽입을 해야 flag.py를 찾을 수 있을 것 같습니다.

문제파일을 받고, 서버를 생성해줍니다.

접속하니 이런 화면이 뜨네요. Ping 메뉴를 클릭하니 아래와 같습니다. ip를 입력하면 ping을 보내는 서비스 같습니다.

여기에 핑을 날려보니 제대로 받는건 확인됩니다.

이제 다시 home으로 와서, 위조된 명령어를 삽입해보려고하니 형식일치 내용이 나오길래, ctrl+U로 소스코드를 확인해주니 패턴이 나옵니다.

영어 대소문자 및 숫자와, 총 5-20 문자까지로 매칭되어야 함을 확인할 수 있습니다.

flag.py를 확인해보니 FLAG 값을 출력하는 cat이나 put 등으로 뽑아내면 될 것 같습니다.

운영체제 명령어 삽입의 종류는 아래와 같다.

1) ; : 해당 라인의 명령어를 성공, 실패와 관련 없이 모두 실행

 - 예시) ping 8.8.8.8; cat flag.py

2) | : 앞의 명령어 처리결과(ping 8.8.8.8)를 뒤 명령어로 전달하여 뒤 명령어를 실행

 - 예시) ping 8.8.8.8 | cat flag.py

3) || : ping 8.8.8.8를 먼저 실행하고 명령 실행에 성공할 경우 뒤 명령은 실행하지 않고, 실패 시 cat.flag.py를 실행

 - 예시) ping 8.8.8.8 || cat flag.py

4) && : ping 8.8.8.8을 먼저 실행하고, 명령 실행에 실패할 경우 뒤 명령은 실행하지 않음

 - 예시) ping 8.8.8.8 && cat flag.py

 -> ping 명령어 결과로 cat flag.py 명령어를 수행하는데 이렇게 되면 실제로 모두 수행되지만 화면에는 cat 결과만 출력된다.

 

이제 BURPSUITE를 통해 프록시 우회하여 조작 해보도록 한다.

1. intercept off 의 상태에서, 아래 open browser를 클릭하여 새 브라우저를 연다.

2. intercept on 상태로 클릭하고, 

3. 새로 열린 창에서 8.8.8.8을 입력하고 ping을 날린다.

4. 그러면 아래 같이 입력된 값이 보인다.

여기서, host=8.8.8.8에 명령어 삽입을 할 수 있도록 입력하고, forward를 한다.(host=8.8.8.8"; cat flag.py")

5. 그럼 아래처럼 브라우저에서 DH 값을 뱉어내는걸 확인할 수 있다.

이렇게 프록시를 우회해서 찾을수도 있고, 개발자도구에서 그냥 패턴부분을 삭제해버리고 찾을 수도 있다고한다. 참고.

 

반응형

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

Carve Party 문제풀이  (0) 2025.02.02
rev-basic-0 문제풀이  (0) 2025.02.02
file-download-1 문제풀이  (0) 2025.02.01
devtools-sources 문제풀이  (1) 2025.02.01
Exercise: SSH  (0) 2025.01.04

WRITTEN BY
SiriusJ

,
반응형

이 문제를 풀어야합니다.

file download 취약점이 존재한다고 하니, 서버사이드에서 취약한 부분이 존재하나 봅니다.

우선 서버를 생성해줍니다.

host1.dreamhack.games:10912 로 접속해보면 뭔가 나올 것 같습니다.

일단 문제파일을 받습니다.

파일이 존재하는걸 볼 수 있고, app.py를 확인해보니 아래와 같습니다.

#!/usr/bin/env python3
import os
import shutil

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)

UPLOAD_DIR = 'uploads'


@APP.route('/')
def index():
    files = os.listdir(UPLOAD_DIR)
    return render_template('index.html', files=files)


@APP.route('/upload', methods=['GET', 'POST'])
def upload_memo():
    if request.method == 'POST':
        filename = request.form.get('filename')
        content = request.form.get('content').encode('utf-8')

        if filename.find('..') != -1:
            return render_template('upload_result.html', data='bad characters,,')

        with open(f'{UPLOAD_DIR}/{filename}', 'wb') as f:
            f.write(content)

        return redirect('/')

    return render_template('upload.html')


@APP.route('/read')
def read_memo():
    error = False
    data = b''

    filename = request.args.get('name', '')

    try:
        with open(f'{UPLOAD_DIR}/{filename}', 'rb') as f:
            data = f.read()
    except (IsADirectoryError, FileNotFoundError):
        error = True


    return render_template('read.html',
                           filename=filename,
                           content=data.decode('utf-8'),
                           error=error)


if __name__ == '__main__':
    if os.path.exists(UPLOAD_DIR):
        shutil.rmtree(UPLOAD_DIR)

    os.mkdir(UPLOAD_DIR)

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

upload 디렉토리는 uploads 로 확인할 수 있고, 

URL에 http://host1.dreamhack.games:10912/ 로 들어가보니 아래와 같습니다.

(asd, asdasd는 Upload My Memo를 통해 입력값을 넣어서 나온 결과로 처음화면은 다릅니다.)

여기에 filename과 content를 test로 임의로 넣으니 아래와 같이 생성됩니다.

이렇게 나오는 것을 볼 수 있습니다.

여기서 url을 확인해보니 http://host1.dreamhack.games:10912/read?name=파일명 으로 나오는 것을 볼 수 있습니다.

따라서 여기에 flag.py를 넣어봅니다.

flag.py파일이 없다고 나옵니다.

다시 한번 app.py의 소스코드를 확인해보니 

def upload_memo():
    if request.method == 'POST':
        filename = request.form.get('filename')
        content = request.form.get('content').encode('utf-8')

        if filename.find('..') != -1:
            return render_template('upload_result.html', data='bad characters,,')

        with open(f'{UPLOAD_DIR}/{filename}', 'wb') as f:
            f.write(content)

        return redirect('/')

    return render_template('upload.html')

upload_memo에 파일오픈하는 부분을 참고합니다. 파일앞에 ../ 루트 디렉토리를 통해 접근 가능할 것으로 보입니다.

입력해보니 FLAG 값이 나오는 것을 확인할 수 있었습니다.

flag를 입력해봅니다.

문제 해결된 것을 확인하였습니다.

이번 문제는 소스코드를 분석하고 파일다운로드 취약점에 대한 이해가 있어야 풀수있을것으로 보입니다.

반응형

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

rev-basic-0 문제풀이  (0) 2025.02.02
command-injection-1 문제풀이  (2) 2025.02.01
devtools-sources 문제풀이  (1) 2025.02.01
Exercise: SSH  (0) 2025.01.04
Exercise: Welcome-Beginners  (0) 2025.01.04

WRITTEN BY
SiriusJ

,
반응형

이번에는 개발자도구(F12)를 활용한 플래그를 찾는 문제입니다.

과연 어떤문제일까

 

여기서 문제파일을 받아줍니다.

 

이런 파일들이 포함되어 있습니다.

 

먼저, 문제풀이 사이트에서 ctrl+U 로 소스코드를 확인해줍니다.

뭐 대략 이런식이고... ctrl+f 로 혹시몰라 DH{ 로 검색해보니 플래그가 뜨지는 않습니다 역시나...

그래서, 문제파일들을 하나하나 뒤져봅니다.

main.4c6e144e.map 파일안 소스코드에 아래와 같은 내용이 있습니다.(VS 2022나 메모장으로 소스코드 확인하셔도 편합니다.)

바로 정답에 입력하니, 정답.....

생각보다 아무것도 없었던 문제라 뭔가 아쉬웠던..

반응형

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

rev-basic-0 문제풀이  (0) 2025.02.02
command-injection-1 문제풀이  (2) 2025.02.01
file-download-1 문제풀이  (0) 2025.02.01
Exercise: SSH  (0) 2025.01.04
Exercise: Welcome-Beginners  (0) 2025.01.04

WRITTEN BY
SiriusJ

,

Exercise: SSH

Security/드림핵 2025. 1. 4. 14:05
반응형

이번엔 SSH 를 활용하는 간단한 flag 찾기 문제입니다.

문제 설명은 위와 같습니다.

우측 상단에서 문제파일을 받고, flag 파일을 확인해보니 아래와 같았습니다.

> DH{this_is_not_real}

 

힌트를 알 수 없기에, 우선 서버를 생성하니 아래와 같습니다.

SSH를 활용하라고 했기 때문에, putty로 접속하여 host1.dreamhack.games 에 11553 포트로 접속을 시도해봅니다.

연결이 되는것을 확인하였고, 로그인 ID를 입력받도록 확인됩니다.

이제 문제설명에서 주어진 ID/PW를 통해 접속해봅니다.

접속해서 ls로 파일들을 확인해보니, flag 파일이 보입니다.

어떤 값이 들어있는지 확인을 위해 cat으로 flag 파일을 읽어봅니다.

이제야 flag 값이 보이는 것을 확인할 수 있습니다.

이제 사이트에서 해당 flag 값을 입력해줍니다.

성공입니다. putty를 활용한 아주 간단한 SSH 문제였습니다.

반응형

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

rev-basic-0 문제풀이  (0) 2025.02.02
command-injection-1 문제풀이  (2) 2025.02.01
file-download-1 문제풀이  (0) 2025.02.01
devtools-sources 문제풀이  (1) 2025.02.01
Exercise: Welcome-Beginners  (0) 2025.01.04

WRITTEN BY
SiriusJ

,
반응형

드림핵을 시작했습니다.

문제를 차근차근 열심히 풀어보려고합니다.

먼저 비기너 문제부터 시작합니다~

Dreamhack을 입력해서 플래그를 획득하라고 합니다.

 

우측

우측에 보면 문제 파일을 받을 수 있고, 해당 파일을 에디터로 열어보면 아래와 같은 소스가 확인됩니다.

코드를 분석해보면 Dreamhack을 입력하면, Welcome Beginners! 라는 메시지와 함께 flag 값을 읽어와서 puts(출력)해주는 것을 알 수 있습니다.

이제 서버를 먼저 생성해주면 위 이미지처럼 생성됩니다.

따라서 Linux에서 NC(netcat) 명령어를 이용해서 플래그를 추출하려고 합니다.

그래서, Linux 환경을 만들어주기 위해 vmware와 저는 Rocky리눅스를 올려서 리눅스 환경을 구축했습니다.

적당히 설정해준 후, 내부로 들어가서 Rocky linux를 install해줍니다.

설치된 후, nc 명령어를 이용해 아래처럼 입력해줍니다.

이제, Dreamhack을 입력합니다.

위처럼 Flag 값이 puts 되고, 해당 값을 확인할 수 있습니다.

 

 

입력하면, 맞춤으로 뜨는걸 확인할 수 있습니다.

이상으로 가장 입문 문제를 풀어보았습니다.

반응형

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

rev-basic-0 문제풀이  (0) 2025.02.02
command-injection-1 문제풀이  (2) 2025.02.01
file-download-1 문제풀이  (0) 2025.02.01
devtools-sources 문제풀이  (1) 2025.02.01
Exercise: SSH  (0) 2025.01.04

WRITTEN BY
SiriusJ

,
반응형
반응형

이번에는 제가 원하는 정적으로 동작하는 웹 사이트에서 제품명, 제품유형, 제조사, 인증일, 인증만료일 등 데이터를 추출하는 프로그램을 파이썬으로 구현해보았습니다.

항상 크롤링에서 중요한 것은, 파싱하고자 하는 웹 사이트의 HTML에서 원하는 경로를 바로 파악하는 능력이 필요하다고 생각합니다.

(내가 원하는 데이터가 어떤 div 태그영역에 있는지 확인하고, div 태그 내에서 class 값 또는 id 값 등을 이용해 해당 데이터를 추출할 수 있는지가 필요)

아래는 제가 원하는 사이트에서 html 내 태그값을 이용하여 제품명, 분류, 제조사, 인증일, 인증만료일, 상태값을 추출하는 코드입니다.

import requests, openpyxl
from bs4 import BeautifulSoup

wb = openpyxl.Workbook()
sheet = wb.active

sheet.append(["제품명", "분류", "제조사", "인증일", "인증만료일", "상태값"])

#크롤링할 사이트 직접입력하였으며, URL 변수로 별도 선언 후 input() 을 통해 크롤링할 URL을 입력받도록 만들어도 됨.
for i in range(1, 10+1, 1):
    raw = requests.get(
       "https://www.bsi.bund.de/SiteGlobals/Forms/IT-Sicherheitskennzeichen/EN/IT-Sicherheitskennzeichen_Formular.html?gtp=980004_list%253D{}".format(
          (i)))
    html = BeautifulSoup(raw.text, 'html.parser')

    #크롤링 할 영역을 container로 저장
    container = html.select(".c-search-results > ul > li")

    for c in container:
       #제품명 추출
       product_name = c.select_one(".c-search-result-teaser__headline").text.strip()

       #본문(카테고리, 제조사, 인증일, 인증만료일)의 데이터를 추출하여 line별로 list에 저장
       product_data = c.select_one(".c-search-result-teaser__content").text.strip()
       product_data_list = product_data.splitlines()

       #리스트로부터 제품의 카테고리, 제조사, 인증일, 인증만료일 데이터를 추출
       category = product_data_list[0].replace("Category: ", "")
       manufacturer = product_data_list[1].replace("Manufacturer: ", "")
       Date_of_issue = product_data_list[2].replace("Date of issue: ", "")
       end_of_term = product_data_list[3].replace("End of term: ", "")

       #제품의 상태값은 해당 제품들의 링크로 들어가서 추출해야하므로, 링크값(a태그) 추출 후, 한번 더 BeautifulSoup를 이용해 Status 값을 추출 
       product_status_link = c.find('a')['href']

       raw_status = requests.get('https://www.bsi.bund.de/' + product_status_link)
       html_status = BeautifulSoup(raw_status.text, 'html.parser')

       product_status = html_status.select_one('.c-product-stage__security-status').text.strip()
       
       #엑셀 시트에 저장
       sheet.append([product_name, category, manufacturer, Date_of_issue, end_of_term, product_status])
       
wb.save("C:/Users/user/Documents/bsi_product_search.xlsx")

 

결과

 

위 코드에서 포인트는 A웹사이트에서, A->A' 사이트(A'는 각 제품의 상세페이지)로 한번 더 들어가서 제품의 현재 상태값(status)을 추출해주는 부분입니다.

각 제품들의 링크로 들어가서 한번 더 beautifulsoup를 이용해 파싱하고, 상태값을 불러오는 부분에서 상당한 딜레이가 발생하는 것을 확인하였습니다.

어떻게 성능을 개선할지가 다음 과제인것 같습니다.

좋은 의견 있으실 경우 남겨주시면 언제든 환영입니다.

반응형

WRITTEN BY
SiriusJ

,
반응형
반응형

최근 해외 사이트들의 동향을 조사하고 본문 내용을 정리하는데 번역을 한번 돌리고 파일화 하는 작업들이 많다보니 이를 파이썬으로 만들면 어떨까해서 아래처럼 만들어 보았습니다.

작업 순서는 아래와 같습니다.

- 1) 원하는 사이트 정적 웹 크롤링(BeautifulSoup)

- 2) Googletranslate 를 활용한 번역

- 3) 번역한 내용을 메모장 파일로 저장

(코드)

import requests, googletrans, time
from bs4 import BeautifulSoup

maxsize = 4500
sleep_time = 2

translator = googletrans.Translator()

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

url = input("번역할 웹 페이지의 URL을 입력하세요: ")
data = requests.get(url, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

# 글 제목 추출
title = soup.select('.metadata-content-area')
for index, element in enumerate(title, 1):
    f = open('C:/Users/USER/PycharmProjects/global_iot_security/test.txt', 'w', encoding='UTF-8')
    trans_title = translator.translate(element.text.strip(), src = 'en', dest='ko')
    f.write("{} 번째 게시글의 제목: {}".format(index, trans_title.text))
    f.close()

# 세부내용 추출
full_contents = soup.select('.doc-content-area')
for i in full_contents:
    txt_contents = i.get_text()
    f = open("C:/Users/USER/PycharmProjects/global_iot_security/test.txt", "a", encoding='UTF-8')

    #txt_contents가 maxsize 보다 클 때(5000자 이상이면 오류 발생, 4500자씩 분해하여 번역)
    if len(txt_contents) > maxsize:
        results_list = []
        concatenated_result = ""

        original_contents = [txt_contents[i:i + maxsize] for i in range(0, len(txt_contents), maxsize)]

        for i in original_contents:
            r = translator.translate(i.strip(), dest='ko', src='en')
            time.sleep(sleep_time)
            results_list.append(r.text)
            f.write(r.text.strip())

        for i in results_list:
            concatenated_result += i

    # 전체 내용이 4500자 이하라면, 그대로 본문 전체를 번역하여 파일로 씀
    else:
        res = translator.translate(txt_contents.strip(), dest='ko', src='en')
        time.sleep(sleep_time)
        f.write(res.text.strip())
    f.close()


 

* 단 주의할 점은, 코드에서 번역시에 5천자가 넘게되면 번역 오류가 발생하게 됩니다.

따라서 저는 우선 전체 크롤링 할 내용이 4500자를 기준으로 넘는지 안넘는지를 비교하여 경우에 따른 케이스로 만들어보았습니다.

beautifulsoup를 활용해서 정적 크롤링을 했는데, 1시간정도에 급하게 만드느라 세밀한 코딩결과는 아닙니다.

이유는?

4500자를 넘길때, 해당 구간에서는 번역이 꼬일 수 있기 때문입니다.

일차적으로 만들어보았고, 추가적으로 보완하려고 합니다.

반응형

WRITTEN BY
SiriusJ

,
반응형
반응형

최근에 파이썬으로 프로그램을 만들어보고 있는데, pycharm으로 개발하면서 실행파일로 누구나 사용할 수 있도록 하기 위해 배포하려고 해서 관련 포스팅을 남깁니다.

 

가장 일반적인 실행파일 생성 방법은 PyInstaller 또는 **cx_Freeze**와 같은 패키지를 사용하는 것입니다. 여기서는 가장 많이 사용되는 **PyInstaller**를 활용하여 파이썬 스크립트를 실행 파일로 만드는 방법을 다루겠습니다.

1. PyInstaller 설치

PyInstaller는 파이썬 스크립트를 단일 실행 파일로 변환해주는 도구입니다. 터미널이나 명령 프롬프트에서 다음 명령어로 설치할 수 있습니다.

(windows : cmd 창)

> pip install pyinstaller

 * 혹시라도 pip가 설치되어있지 않다고 할 경우에는, python을 제어판에서 삭제했다가 다시 설치하고, 설치할 때 환경변수 등 관련 체크박스가 해제되어있는 부분을 확인하고 체크해주신 후에 설치하면 pip가 자동으로 설치되게 됩니다. 이후에는 pip를 이용한 install 등 가능하게 됩니다.

 

2. PyInstaller 사용 방법

설치 후, 파이썬 스크립트를 실행 파일로 변환하려면 터미널 또는 명령 프롬프트에서 다음 명령을 입력합니다:

> pyinstaller --onefile 'test.py'

여기서 'test.py'는 실행 파일로 만들고자 하는 본인의 파이썬 파일 이름입니다.

주요 옵션:

  • --onefile: 하나의 실행 파일로 만듭니다. 기본적으로 PyInstaller는 여러 파일을 생성하는데, 이 옵션을 사용하면 단일 파일로 묶어줍니다.
  • --noconsole: 프로그램을 콘솔 창 없이 GUI 형태로 실행하고 싶을 때 사용합니다. (GUI 프로그램인 경우에만 유용)

 

3. 실행 파일 생성 과정

PyInstaller가 실행되면, 다음과 같은 작업을 수행합니다:

  • dist/ 폴더에 실행 파일이 생성됩니다.
  • build/ 폴더에 빌드와 관련된 파일이 생성됩니다.
  • .spec 파일이 생성되며, 이는 빌드 구성을 저장하는 파일입니다.

 

4. 실행 파일 배포

dist/ 폴더에 생성된 .exe 파일을 다른 사용자에게 배포할 수 있습니다. 배포할 때는 해당 파일만 전달하면 됩니다.

 

5. 참고 사항

  • 윈도우에서 만든 실행 파일은 윈도우에서만 실행 가능하고, macOS 또는 리눅스에서 만들면 그 운영체제에서만 실행 가능합니다. 각 운영체제에서 해당 OS에 맞게 빌드해야 합니다.
  • 실행 파일 크기가 커질 수 있으므로 불필요한 패키지는 제외하는 것이 좋습니다. 이를 위해 .spec 파일을 편집할 수 있습니다.

 

6. 실행 파일로 만들 때 발생할 수 있는 문제 해결

  • 외부 모듈이 포함되지 않는 문제: 일부 외부 모듈이 자동으로 포함되지 않을 수 있습니다. 이 경우, hidden-import 옵션을 사용하여 추가합니다.

> pyinstaller --onefile --hidden-import <module_name> 'test.py'

 

7. PyInstaller 외 다른 도구

  • cx_Freeze: PyInstaller와 유사하게 파이썬 스크립트를 실행 파일로 만들 수 있는 도구입니다. GUI 애플리케이션을 제작할 때 주로 사용됩니다.

> pip install cx_Freeze

> cxfreeze your_script.py --target-dir dist

반응형

WRITTEN BY
SiriusJ

,