인스턴스 ssh 접속하는 법 
ssh 사용자명@아이피 -i 키파일이름
ex) ssh ec2-user@10.0.0.8 -i key.pem

접속하고 나서 도커 다루는 법 
가장 먼저 sudo su (귀찮은 sudo 붙이기 없이 명령어 사용가능)
^ 매번 들어올때마다 해줘야함

sudo yum install -y docker 

도커 설치 [ec2]

 

sudo systemctl start docker

sudo systemctl enable docker

도커실행 [ec2]

 

공개과제 파일 인스턴스로 가져오는 법 
[중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)

scp -i "KEYYY.pem" "37.클라우드컴퓨팅(2023 지방).zip" ec2-user@[서버주소 ec2]:/home/ec2-user/cloud.zip

 [local to ec2] ( 뒤에 있는 cloud.zip은 이름을 변경해준거임)

 

unzip cloud.zip

압축해제 [ec2] 

 

sudo docker build . --tag about:latest

[ 도커빌드 (이미지만들기) ] ec2

 

sudo docker run -d --rm -p 5000:5000 about:latest

[ 도커 이미지 실행 ] ec2

 

sudo docker ps -a

[ 실행중인 도커 컨테이너 목록 보기 ]

 

sudo docker rm -f [컨테이너 ID]

[ 컨테이너 종료 ]

EC2 인스턴스 생성 (Bastion A, Basiton B) 

문제에서는 Bastion_A 여서 솔직히 이름이 틀리긴 했는데 그냥 연습삼아 하는거니까 알아서 이해하길 바람..

 

Bastion A, Service A끼리 같은 키로 

Bastion B, Service B끼리는 같은 키로 만들라고 했으니까 키는 총 KEY_A 와 KEY_B pem을 만들어서 적용해준다.

 

Bastion A는 VPC A의 Public subnet 에 만들어준다 

퍼블릭 자동 할당 활성화

 

이번 문제에서 보안그룹은 총 5개 ( 인스턴스에 각각 하나씩 , ALB용 하나 )

다른 대역의 VPC끼리는 같은 보안그룹 설정이 불가해서 Basiton A와 B가 성질이 비슷해도 따로 만들어줘야함 

 

그래서 Bastion A, B의 보안그룹 설정은 SSH 접속이 가능하게 만들어준다 

 

EC2 인스턴스 생성 (Service A, Service B)

Service A의 key.pem은 Bastion A와 같은 KEY_A 

service B의 key.pem은 Bastion B와 같은 KEY_B

 

 

Service 보안그룹 설정하다가 문제랑 그림이랑 다르고 ALB도 달라서 그냥 던짐 

2023 글 쓰는걸로 ^-^

VPC 생성은 딸깍 이라 제외

서브넷 연결 설정

퍼블릭 서브넷들은 서브넷 설정 편집 -> 자동 할당 활성화 해준다

 

 

인터넷게이트웨이 설정

igw 는 VPC에 각각 하나씩 만들고 연결해주고 

라우팅 테이블 -> 퍼블릭A,B 라우팅테이블에 라우팅 설정 편집 ->로컬은 냅두고 0.0.0.0/ + igw 설정 

 

 

라우팅테이블 설정

라우팅 테이블은 기본적인 테이블을 제외하고 총 서브넷에 각각 하나씩 4개를 만들어준다

 

NAT 게이트웨이 설정

NAT 게이트웨이는 프라이빗을 위한 통로이다 

그렇기 때문에 프라이빗 말고 퍼블릭에 만들어줘야한다. 

퍼블릭 서브넷 A,B에 만들어주자.

 

PCX (피어링) 설정

요청자에 A VPC 를 넣고 수락자에 B VPC 를 넣고 
내 계정과 현재 리전 을 선택해준다.
설정을 마치고 피어링 연결 생성 을 누르면 Peering 상태에 수락 대기중 이라는 글이 뜨는데 

해당 VPC Peering을 선택하고 작업 버튼을 눌러 요청 수락을 눌러준다.

 

 

VPC_A의 아이피를 복사해서 

public b, private b 라우팅 테이블에 라우팅 편집에 들어가서 붙여넣고 -> 피어링 연결에 생성된 피어링을 선택해준다  

 

VPC_B의 아이피를 복사해서 

똑같이 public a, private a에 설정해준다

 

선배님이 알려주신 비유는.. 

피어링을 생성한것 = > VPC끼리 연결해주는 다리를 놓은것

라우팅테이블에 설정해준것 = > 다리 놓았다고 홍보한것 

ㅋㅋㅋㅋ 하나도 몰랐는데 알아먹음.

 

 

남은건 ec2, 피어링,웹서버구축 등등등.. 이 남았는데 문제가 뭐 이래 오류가 많은건지 ec2 하다가 던짐 2023 하러 감.

ec2 초반 글은 있음.....

정수 모듈로 n으로 이루어진 집합은 덧셈과 곱셈의 연산을 포함하여 링(Ring)이 됩니다.
이는 집합 내의 두 요소를 더하거나 곱하는 경우에도 집합 내의 다른 요소가 반환된다는 것을 의미합니다.
모듈러스가 소수일 때: n = p인 경우, 우리는 집합 내의 모든 요소에 대한 역원을 보장받으며, 이로 인해 링은 필드(Field)로 승격됩니다. 이 필드를 유한체 Fp라고 합니다.Diffie-Hellman 프로토콜은 일반적으로 큰 소수인 유한체 Fp의 요소들로 작동합니다.
소수 p = 991과 요소 g = 209가 주어진 경우, g * d mod 991 = 1을 만족하는 역원 d를 찾아보겠습니다.

 

역원으로 d를 구하면 되는 문제이다 역원은 RSA에서도 했듯이 pycrypto 안에있는 inverse함수로 구할 수 있다.

from Crypto.Util.number import inverse
print(inverse(209, 991))

g(209) inverse 991 을 하면 당연히 d 가 나온다 

569 가 flag

'Cryptography' 카테고리의 다른 글

RSA CRT Attack 중국인 나머지 정리  (2) 2024.05.08
[python] .pem 파일에서 e,n 얻기  (0) 2024.03.27
RSA 낮은 지수 공격 cyling Attack code  (0) 2024.03.03
BraekerCTF Write up - Thus spoke machine  (0) 2024.02.29
RSA 역원  (0) 2024.02.17

wiener 공격과는 반대로 e값이 매우 작을때 사용된다 이때 e 값은 주로 3으로 설정된다 

 

from gmpy2 import iroot, local_context

c = 

with local_context() as ctx:
    ctx.precision = 3000
    m = iroot(c,3)[0]
   
    print(bytes.fromhex('%x' % int(m)))

'Cryptography' 카테고리의 다른 글

[python] .pem 파일에서 e,n 얻기  (0) 2024.03.27
[Cryptohack] Diffie-Hellman Starter 1 write up  (0) 2024.03.04
BraekerCTF Write up - Thus spoke machine  (0) 2024.02.29
RSA 역원  (0) 2024.02.17
RSA Wiener attack code  (0) 2024.02.17

wiener attack 이란 단순히 말해 e 값이 클때 사용할수 있는 공격이다.

대게 확률적으로 e값이 증폭적으로 크다면 d값이 작을 확률이 매우 높기때문에 

wiener 공격을 하면 d를 알아낼수있어 RSA 취약점인 개인키가 공개되기 때문에 이를 이용하여 flag를 알아낼수있다

 

RSA에서 텍스트파일로 저장된 Public key.pem 파일을 읽어와서 키 파일을 얻어오는 코드와 

wiener 공격을 한 파일에 담아 정리했다

https://github.com/pablocelayes/rsa-wiener-attack/blob/master/RSAwienerHacker.py

E,n값과 public key 텍스트 파일을 입력해 긁어오는 방식

키를 직접 추가 하고 싶다면 키를 가지고 오는 코드를 삭제후 본인이 입력하면 제대로 동작한다.

from Crypto.Util.number import*
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
from base64 import b64encode

# Get public key from a file
pubkey_file = open("public_key.pem", 'r')
pubkey = pubkey_file.read()
pubkey_file.close()

flag_file = open("flag.txt", 'r')
flag = int(flag_file.read(), 16)
flag_file.close()

msg = "plain text"           

# Create key using public key
keyPub = RSA.importKey(pubkey)
cipher = Cipher_PKCS1_v1_5.new(keyPub)
cipher_text = cipher.encrypt(msg.encode())
emsg = b64encode(cipher_text)
encryptedText = emsg.decode('utf-8')

n = keyPub.n
e = keyPub.e

def convergents_from_contfrac(frac):
    convs = [];
    for i in range(len(frac)):
        convs.append(contfrac_to_rational(frac[0:i]))
    return convs

def contfrac_to_rational (frac):
    if len(frac) == 0:
        return (0,1)
    num = frac[-1]
    denom = 1
    for _ in range(-2,-len(frac)-1,-1):
        num, denom = frac[_]*num+denom, num
    return (num,denom)

def is_perfect_square(n):
    h = n & 0xF; 
    
    if h > 9:
        return -1 

    
    if ( h != 2 and h != 3 and h != 5 and h != 6 and h != 7 and h != 8 ):
        # take square root if you must
        t = isqrt(n)
        if t*t == n:
            return t
        else:
            return -1
    
    return -1

def test_is_perfect_square():
    print("Testing is_perfect_square")
    testsuit = [4, 0, 15, 25, 18, 901, 1000, 1024]
    
    for n in testsuit:
        print("Is ", n, " a perfect square?")
        if is_perfect_square(n)!= -1:
            print("Yes!")
        else:
            print("Nope")
            
def isqrt(n):
    if n < 0:
        raise ValueError('square root not defined for negative numbers')
    
    if n == 0:
        return 0
    a, b = divmod(bitlength(n), 2)
    x = 2**(a+b)
    while True:
        y = (x + n//x)//2
        if y >= x:
            return x
        x = y

def bitlength(x):
    assert x >= 0
    n = 0
    while x > 0:
        n = n+1
        x = x>>1
    return n

def hack_RSA(e,n):
    
    # rational_to_contfrac ref
    x, y = e, n
    
    a = x//y
    pquotients = [a]
    while a * y != x:
        x,y = y,x-a*y
        a = x//y
        pquotients.append(a)
    frac = pquotients
    # rational_to_contfrac ref end


    convergents = convergents_from_contfrac(frac)
    
    for (k,d) in convergents:
        
        #check if d is actually the key
        if k!=0 and (e*d-1)%k == 0:
            phi = (e*d-1)//k
            s = n - phi + 1
            discr = s*s - 4*n
            if(discr>=0):
                t = is_perfect_square(discr)
                if t!=-1 and (s+t)%2==0:
                    print("Hacked!")
                    return d
 
d = hack_RSA(e,n) 
pt = pow(flag,d,n)
print(long_to_bytes(pt))

 

 

'Cryptography' 카테고리의 다른 글

BraekerCTF Write up - Thus spoke machine  (0) 2024.02.29
RSA 역원  (0) 2024.02.17
선택 암호문 공격(Chosen Ciphertext Attack) - testbook rsa  (0) 2024.02.14
RSA 수학적 원리 발표 / 세특  (1) 2024.01.03
Factordb 사용법  (0) 2024.01.03

+ Recent posts