728x90

PEM

Public Key Infrastructure Enhanced Mail

X.509 디지털 인증서와 키를 저장하고 전송하기 위한 표준 형식

텍스트 형식으로 인코딩되어 있으며, 보통 .pem 확장자를 가짐

일반적으로는 인증서, 개인 키, 공개 키 등의 암호학적 자격 증명 요소를 포함

 

RSA

비대칭 키 암호화 방식 (공개 키 - 데이터 암호화 / 개인 키 - 데이터 복호화)소인수분해의 어려움에 기반

 

Key Generation

1. 큰 소수 2개 p와 q를 선택2. n 계산 : n = p*q3. 오일러 파이 함수 계산 : ϕ(n) = (p-1) * (q-1) 4. ϕ(n)과 서로소인 정수 e 선택 5. e의 역원을 계산하여 d를 구함 : e * d ≡ 1 (mod ϕ(n))

→ 공개키 (n,e) / 개인 키 (n,d)

 

Encryption : C ≡ M^e (mod n)

Decryption : M ≡ C^d (mod n)

 

 

RSA 공격기법

 

[참고1] https://blog.naver.com/yjw_sz/221441769257

[참고2] https://velog.io/@pezluna/RSA

 


풀이

암호문 파일
공개키 파일

제공된 파일에는 암호문 파일과 공개키 파일이 들어있다.

 

pem 형식으로 된 공개키를 OpenSSL을 사용하여 파싱하여 공개키 (n,e)를 얻었다. 

(dreamhack 툴로 파싱하는 방법을 알고 싶다..)

openssl rsa -pubin -inform PEM -text -noout < pub.pem

 

공개키 n을 10진수로 변환하였다.

hex_string = "0328b14139a2e54b88a4662f1a67cc3acd1929c9b62794bb64916aff02991f80456e4d0eed4d591df7708d5af2e9b4fb5689"
decimal_value = int(hex_string, 16)
print(decimal_value)

 

변환한 10진수를 http://factordb.com/ 에 검색하여 소인수 p와 q를 얻었다.

 

구한 p와 q로 개인키 d를 구하고 hex로 변환한 암호문을 복호화해줬다.

from Crypto.Util.number import *

p = 291664785919250248097148750343149685985101
q = 109249057662947381148470526527596255527988598887891132224092529799478353198637
e = 65537 
c = 0x01141f557861aab3439be1eb87a012601536658a05f4f378f7b9dae54a08436e5c435d56dd1b4896b734aecd838841d59226

phi = (p-1)*(q-1)
d = inverse(e, phi)

print("개인키 : ", d)

m = pow(c, d, p*q)

print("복호화  : ", long_to_bytes(m))

 

복호화된 값을 base64 decoding하면 messge를 얻을 수 있다!

 

공부해볼것

- OpenSSL 사용법

- RsaCtftool  : https://github.com/RsaCtfTool/RsaCtfTool

'Write-up > Crypto' 카테고리의 다른 글

[Dreamhack] chinese what?  (0) 2024.04.08
[Dreamhack] likeb64  (0) 2024.04.03
[Dreamhack] darimchal-001  (0) 2024.03.29
[Dreamhack] SingleByteXor  (0) 2024.03.29
[Dreamhack] Basic-Crypto1  (0) 2024.03.29
728x90

 

풀이

제공된 파일에는 chall1.c 파일과 chall1 바이너리 파일이 있다.

 

chall1.c의 코드를 보면 적절한 비밀번호를 입력을 하면 복호화가 되는 것을 알 수 있다.

위 코드를 보면 입력된 비밀번호와 KEY를 XOR한 값을 JOKER와 대조하여 일치하면 올바른 비밀번호로 인식되는 것을 알 수 있다. 따라서 JOKER와 KEY를 XOR 연산하여 원하는 비밀번호 값을 얻을 수 있다는 것을 알 수 있다.  (∵ a = b^c 이면 a^b = c)

jocker = "\x40\x53\x06\x03\x43\x52\x54\x3b"
key = "023661dd4"

tmp = ""
for i in range(8):
    tmp += chr(ord(key[i])^ord(jocker[i]))

print(tmp)

위와 같은 코드를 통해서 원하는 복호화 키를 얻을 수 있다. 

실행 결과

'Write-up > Crypto' 카테고리의 다른 글

[Dreamhack] likeb64  (0) 2024.04.03
[Dreamhack] babycrypto3  (0) 2024.03.29
[Dreamhack] SingleByteXor  (0) 2024.03.29
[Dreamhack] Basic-Crypto1  (0) 2024.03.29
[Dreamhack] ROT128  (0) 2024.03.29
728x90

풀이

제공된 파일에는 DyingMessage 파일이 들어있다.

 

filepath = "D:/dreamhack/SingleByteXor/DyingMessage"

with open(filepath, 'r') as f:
    Msg = f.read()

def XOR(msg, i):
    l = len(msg)
    p = ""
    for j in range(0,l-2,2):
        tmp = int('0x'+msg[j:j+2],16)^i
        p = p+chr(tmp)
    return p

for i in range(0,256):
    print("i = ", i, " ", XOR(Msg, i))

단일 바이트와 XOR 했다는 힌트가 문제에 제공되어있다.

이를 바탕으로 다잉메시지를 바이트 단위로 떼어서 브루트포스 공격을 시행하는 코드를 작성하였다.

실행결과를 살펴보면 16과 xor했을 때 flag가 출력되는 것을 확인할 수 있다. 

'Write-up > Crypto' 카테고리의 다른 글

[Dreamhack] likeb64  (0) 2024.04.03
[Dreamhack] babycrypto3  (0) 2024.03.29
[Dreamhack] darimchal-001  (0) 2024.03.29
[Dreamhack] Basic-Crypto1  (0) 2024.03.29
[Dreamhack] ROT128  (0) 2024.03.29
728x90

풀이

문제에 제공된 Roman emperor's cipher는 시저암호를 의미한다.

제공된 파일에는 암호문이 들어있다.

 

file_path = "D:/dreamhack/Basic_Crypto1/encode.txt"

with open(file_path, 'r') as f:
    cipher_s = f.read()

L = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def c_dec(C,K):
    p = ""
    for i in C:
        if i == ' ':
            p += '_'
            continue
        idx = L.find(i)
        idx = (idx-K)%26
        p = p+(L[idx])
    return p

for i in range(0,26):
    tmp = c_dec(cipher_s,i)
    print("Key=",i," ",tmp)

시저암호 복호화 함수를 작성하고, 전수조사 공격을 진행하는 코드를 작성하였다.

복호화 함수에 문제에서 안내한대로 공백을 언더바로 치환하는 코드도 포함하였다.

코드를 실행봤을때 키가 3일 때 flag가 나오는 것을 확인할 수 있다. 

'Write-up > Crypto' 카테고리의 다른 글

[Dreamhack] likeb64  (0) 2024.04.03
[Dreamhack] babycrypto3  (0) 2024.03.29
[Dreamhack] darimchal-001  (0) 2024.03.29
[Dreamhack] SingleByteXor  (0) 2024.03.29
[Dreamhack] ROT128  (0) 2024.03.29
728x90

풀이

제공된 파일에는 암호화된 encfile과 암호화 코드인 rot128.py 파일이 포함되어있다.

rot128 코드를 살펴보면 시저암호와 유사한 원리로 각 바이트를 16진수 값으로 표현하고, 해당 값을 128만큼 밀어서 새로운 값을 만들어내는 것을 알 수 있다.

hex_list : 0부터 255까지의 각 숫자에 대한 16진수 표현을 담은 리스트

plain_list : plain_s에서 읽은 파일 내용을 각 바이트별로 16진수로 변환하여 저장

암호화 방식 : plain_list의16진수 값의 인덱스를 hex_list에서 찾아내고, 이를 +128만큼 이동

hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

file_path = "D:/dreamhack/ROT128/encfile"

with open(file_path, 'r', encoding='utf-8') as f:
    cipher_s = f.read()

cipher_list = [cipher_s[i:i+2] for i in range(0,len(cipher_s),2)]

dec_list = list(range(len(cipher_list)))

for i in range(len(cipher_list)):
    hex_b = cipher_list[i]
    index = hex_list.index(hex_b)
    dec_list[i] = hex_list[(index-128)%len(hex_list)]
    
plain_list=''.join(dec_list)
byte_data = bytes.fromhex(plain_list)

file_path2 = "D:/dreamhack/ROT128/flag.png"

with open(file_path2, 'wb') as f:
    f.write(byte_data)

문제 코드를 바탕으로 복호화하는 파이썬 코드를 작성하였다. 기존에 +128을 해서 암호화한 부분으로 -128로 복호화할 수 있도록 했다. 그리고 복호화된 hex 값을 다시 byte로 변환하여 암호화를 진행했던 flag.png 파일을 얻을 수 있었다.

flag.png

 

'Write-up > Crypto' 카테고리의 다른 글

[Dreamhack] likeb64  (0) 2024.04.03
[Dreamhack] babycrypto3  (0) 2024.03.29
[Dreamhack] darimchal-001  (0) 2024.03.29
[Dreamhack] SingleByteXor  (0) 2024.03.29
[Dreamhack] Basic-Crypto1  (0) 2024.03.29
728x90

풀이

문제 파일

주어진 문제 파일 중 about.html에 들어갔다.

해당 페이지에서 개발자 도구를 실행해 전체 파일 검색 (ctrl+shift+f)를 통해서 flag를 검색해봤다. 원하는 flag 형식의 결과가 나오지 않았다. 

다음에는 flag 형식인 DH를 검색해봤더니 원하는 flag 값을 얻을 수 있었다.

'Write-up > Web' 카테고리의 다른 글

[Dreamhack] csrf-2  (0) 2024.04.05
[Dreamhack] session  (0) 2024.04.03
[Dreamhack] session-basic  (0) 2024.04.03
[Dreamhack] Cookie  (0) 2024.04.03
[Dreamhack] carve-party  (0) 2024.03.29
728x90

풀이

문제파일에 주어진 html 파일 살펴봤다.

클릭해야하는 호박을 볼 수 있다.

js 코드를 살펴보니 counter를 100으로 나눈 나머지가 0이 될 때마다 어떤 연산이 일어나는 걸 알 수 있다. 다양한 방법이 있지만 for문을 통해 click을 만번하는 코드를 작성하기로 했다.


console에 $('#jack-target').click()를 입력해보면 click이 한 번 된 것을 확인할 수 있다.


이를 for문을 통해 10000번 수행하게 하면 flag를 얻을 수 있다.

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

'Write-up > Web' 카테고리의 다른 글

[Dreamhack] csrf-2  (0) 2024.04.05
[Dreamhack] session  (0) 2024.04.03
[Dreamhack] session-basic  (0) 2024.04.03
[Dreamhack] Cookie  (0) 2024.04.03
[Dreamhack] devtools-sources  (0) 2024.03.29
728x90

Sever-Client

웹 서버에 있는 리소스를 클라이언트가 받아 보려면, 클라이언트는 웹에게 특정 리소스를 지정하여 제공해달라고 요청해야 함. 이때, 서버는 해당 요청을 이해하고 대응되는 동작을 통해 클라이언트에게 리소스 반환함.

Cookie

  • 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용
    • 정보 기록 : 웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 사용
    • 상태 정보 : 웹 서버는 클라이언트를 식별할 수 있는 값을 저장하여 사용
  • HTTP
    • 하나의 Request와 Response의 쌍이 독립적으로 구성되어 통신
      • connectionless 속성 : 하나의 요청에 하나의 응답을 한 후 네트워크 연결을 끝맺는 것
      • stateless 속성 : 네트워크가 연결이 끝맺을 때 상태를 유지하지 않는 것
    • 위와 같은 속성 때문에 HTTP 요청마다 사용자 인증을 해야되는데, 상태를 유지하기 위해서 cookie가 탄생함
  • Cookie 가 있는 통신
    • 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 포함하고, 서버는 해당 쿠키를 통해 클라이언트를 식별함
    • 하지만, 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 쿠키 변조를 통해 공격자가 타 이용자를 사칭해 정보 탈취가 가능함.

Session

  • 세션은 일정 기간동안 같은 사용자(클라이언트)로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술
  • 쿠키에 인증 상태를 저장하지만, 클라이언트가 인증 정보를 변조할 수 없도록 하기 위해 사용
  • 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키 (랜덤 문자)를 만들어 클라이언트에 전달하는 방식
    • 브라우저 -> 해당 키를 쿠키에 저장하고 이후 HTTP 요청을 보냄
    • 서버 -> 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인

개발자 도구 (F12)

  • 요소 검사 버튼 : 웹 페이지의 각 요소에 마우스를 갖다대고 클릭하면 해당 코드를 쉽게 찾을 수 있음
  • 디바이스 툴바 버튼 : 현재 브라우저의 화면 비율 및 User-Agent를 원하는 값으로 변경 가능
  • Elements : 페이지를 구성하는 HTML 검사
  • Console : 자바 스크립트를 실행하고 결과 확인
  • Sources : HTML, CSS, JS 등 페이지를 구성하는 리소스 확인 및 디버깅
  • Network : 서버와 오가는 데이터 확인
  • Application : 쿠키를 포함한 웹 어플리케이션과 관련된 데이터 확인

URI(URL)

  • URI (Uniform Resource Identifier)
    : 인터넷에서 특정 리소스를 나타내는 유일한 주소. URL(Uniform Resource Locator)과 URN(Uniform Resource Name)의 두 가지 형태로 나뉨.
  • URL (Uniform Resource Locator)
    : 인터넷 상의 특정 리소스의 위치를 지정하는 URI의 하위 집합. 일반적으로 프로토콜(예: HTTP, HTTPS), 호스트(웹 사이트의 도메인 이름), 리소스의 경로 및 파일 이름 등의 구성 요소로 구성. 
    ex) "https://www.example.com/page.html" ->  HTTPS 프로토콜을 사용하여 "www.example.com" 호스트에 위치한 "page.html"이라는 파일

포트

  • 호스트 내에서 실행되고 있는 프로세스를 구분짓기 위한 16비트의 논리적 할당
  • 0~65536개의 개수 가짐
  • IP주소는 컴퓨터를 찾을 때 필요한 주소, 포트는 컴퓨터 안에서 프로그램을 찾을 때 사용
  • 포트 번호
    • 0번 ~ 1023번 : well-known port (ex. 80 : HTTP / 443 : HTTPS)
    • 1024번 ~ 49151번 : registered port
    • 49152번 ~ 65535번 : dynamic port (동적 포트)

PHP

  • Hypertext Preprocessor : C언어를 기반으로 만들어진 서버 측에서 실행되는 서버 사이드 스크립트 언어

Burp Suite

  • 웹 응용 프로그램의 보안 테스트 도구
  • 웹 애플리케이션, 모바일 서비스 등을 대상으로 요청에 대한 클라이언트를 대신하여 중간에 만날 수 있는 모든 환경 작업을 수행하기 위한 프록시 서버 기능을 가짐

+ Recent posts