728x90
728x90
728x90
728x90

AES

AES는 연산 능력의 향상으로 DES가 더 이상 안전하지 않게 되자, 새롭게 표준으로 선정된 블록 암호 알고리즘입니다.
내부적인 논의만으로 표준으로 선정된 DES와 달리, AES는 전세계에서 암호 알고리즘을 공모받고, 전문가들의 심사를 거쳐 그 중에서 가장 뛰어난 알고리즘이 선정되었습니다.

당시 공모에 제안된 21개의 암호 알고리즘들 중, 보안성, 효율성, 하드웨어 이식의 적합성, 유연성 등을 고려하여 심사한 결과, Vincent Rijmen, Joan Daemen이 제안한 Rijndael 구조가 채택되었습니다.

표준으로 선정된 이후부터 지금까지, AES에는 기밀성을 위협하는 치명적인 취약점이 발견되지 않았습니다. 또한 CPU 제조사들이 AES 연산을 위한 명령어를 따로 정의해 주어서 암호화, 복호화의 성능도 뛰어납니다. 이런 이유로 현대에는 대칭키 암호 알고리즘을 사용할 때, 일반적으로 AES가 사용됩니다.

 

AES는 SPN(Substitution Permutation Network)이라는 암호 구조를 사용합니다. SPN은 곱 암호의 일종으로,

S-Box를 사용하는 치환(Substitution)과 P-Box를 사용하는 순열(Permutation)을 여러 라운드에 걸쳐 반복합니다.

페이스텔 구조와 달리 라운드마다 입력 전체에 라운드 함수를 적용하므로,

같은 수의 라운드를 사용할 때 SPN이 페이스텔 구조에 비해 암호학적으로 두 배 더 안전합니다.


AES 구조

AES는 라운드마다 128비트 크기의 블록을 암호화하는 블록 암호입니다.

키의 길이는 128, 192, 256비트 중 하나를 선택할 수 있고, 라운드 수는 키의 길이에 따라 10, 12, 14로 결정됩니다.

키의 길이가 128비트이면 AES-128, 192비트이면 AES-192, 256비트이면 AES-256이라고 부릅니다.


AES는 암호화를 할 때, 가장 먼저 각 블록을 4행 4열의 상태 배열(State)로 재구성합니다.

State의 각 칸에는 8비트(1바이트)가 저장됩니다.


입력 1F3CF203B211C5AA6EB27A45E4D98130은 다음과 같은 state로 재구성됩니다.

$$\begin{bmatrix} 1F&3C&F2&03\\B2&11&C5&AA\\6E&B2&7A&45\\E4&D9&81&30 \end{bmatrix}$$

이후에는 재구성된 입력에 대해 AddRoundKey 함수를 적용하고,

마지막 라운드 전까지 매 라운드마다 SubBytes, ShiftRows, MixColumns, AddRoundKey 함수를 반복하여 적용합니다.

마지막 라운드에서는 MixColumns를 제외한 나머지 함수들만 적용합니다.

 

AES의 라운드 함수들은 역함수가 존재하므로, 역함수를 이용하여 AES 복호화가 이뤄집니다.

이제부터는 라운드를 구성하는 각 함수들에 대해 알아보겠습니다.


AES 라운드 함수

SubBytes

SubBytes는 State의 각 바이트를 S-Box를 참조하여 치환하는 함수입니다. 바이트의 상위 4비트가 행, 하위 4비트가 열을 결정합니다. 예를 들어 어떤 바이트가 2A라면, 해당 바이트는 S-box의 2행 A열을 참조하여 E5로 치환됩니다.

$$SubBytes \begin{pmatrix}
\begin{bmatrix}
D7 & 32 & 97 & 71 \\
12 & AA & F2 & EC \\
04 & 00 & CA & F9 \\
5E & 13 & B1 & 16 \\
\end{bmatrix}
\end{pmatrix} = 
\begin{bmatrix}
0E & C9 & F2 & 58 \\
23 & AC & 63 & 7D \\
88 & 89 & 74 & C8 \\
A3 & CE & 99 & 47 \\
\end{bmatrix}$$

 

ShiftRows

ShiftRows는 State의 각 행을 구성하는 바이트들을 쉬프트하는 함수입니다. 이 함수는 4가지 함수 중에서 유일하게 순열의 역할을 수행합니다. 아래와 같이 2행은 왼쪽으로 1칸, 3행은 왼쪽으로 2칸, 4행은 왼쪽으로 3칸을 밉니다. 복호화할 때는 반대로 2행, 3행, 4행을 각각 오른쪽으로 1칸, 2칸, 3칸씩 밉니다.

$$ShiftRows \begin{pmatrix}
\begin{bmatrix}
AE & 72 & 3C & 7E \\
83 & 1A & 32 & D3 \\
97 & 18 & 6A & C1 \\
56 & 0C & 29 & 86 \\
\end{bmatrix}
\end{pmatrix} = 
\begin{bmatrix}
AE & 72 & 3C & 7E \\
1A & 32 & D3 & 83 \\
6A & C1 & 97 & 18 \\
86 & 56 & 0C & 29 \\
\end{bmatrix}$$

 

MixColumns

MixColumns는 열 단위로 치환을 수행하는 함수입니다.

$$\begin{bmatrix}
b_{0} \\
b_{1} \\
b_{2} \\
b_{3} \\
\end{bmatrix} = 
\begin{bmatrix}
02 & 03 & 01 & 01 \\
01 & 02 & 03 & 01 \\
01 & 01 & 02 & 03 \\
03 & 01 & 01 & 02 \\
\end{bmatrix}
\begin{bmatrix}
a_{0} \\
a_{1} \\
a_{2} \\
a_{3} \\
\end{bmatrix}$$

 

AddRoundKey

이 함수는 키 생성 함수(Key Schedule)로 생성된 라운드 키의 state를 각 바이트별로 XOR합니다. 복호화할 때는 XOR의 성질을 이용하여 동일한 키를 state에 XOR합니다.

$$AddRoundKey\begin{pmatrix}
state = 
\begin{bmatrix}
63 & A9 & 24 & 0D \\
5C & 2A & 74 & B6 \\
A3 & 30 & 5D & 11 \\
C5 & 2C & 34 & 7C \\
\end{bmatrix},
key = 
\begin{bmatrix}
21 & 3C & C5 & 71 \\
CC & 6A & 82 & C1 \\
75 & 20 & 53 & 9C \\
15 & 7C & 63 & 1E \\
\end{bmatrix}
\end{pmatrix} = 
\begin{bmatrix}
42 & 95 & E1 & 7C \\
90 & 40 & F6 & 77 \\
D6 & 10 & 0E & 8D \\
D0 & 50 & 57 & 62 \\
\end{bmatrix}$$


키 생성 함수는 입력된 키로부터 각 라운드에 쓰일 라운드 키를 생성합니다. AES는 암복호화를 시작할 때와 매 라운드마다 AddRoundKey를 적용합니다. 따라서 AES-128에서는 라운드 키가 11개 필요합 합니다.
각 라운드 키는 4행 4열의 행렬이므로, 4행 44열의 키 행렬을 하나 만들고, 이를 4열씩 나눠서 매 AddRoundKey마다 사용하면 됩니다.

첫번째 AddRoundKey에서는 입력된 키를 그대로 사용합니다.

\(w_{i\geq4}\)는 \(W_{i-1}\)에 RotWord, SubWord, Rcon을 적용하고, 이를 \(W_{i-4}\)와 XOR하여 생성합니다.


참고문헌

wikipedia - Advanced Encryption Standard

educative - What is the AES algorithm?

728x90
728x90

'암호학' 카테고리의 다른 글

중국인의 나머지 정리  (0) 2022.03.01
공개키암호 RSA  (0) 2022.02.06
블록암호 DES  (0) 2022.01.31
암호화 종류  (0) 2021.12.04
암호의 역사  (0) 2021.11.04

728x90
728x90

SSTI(Server Side Template Injection)

SSTI(Server Side Template Injection) 취약점은 서버측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입, 실행되면서 생기는 취약점이며 웹 템플릿 엔진마다 사용되는 페이로드가 다릅니다.

 

웹 템플릿이란?

웹 템플릿 엔진은 웹 템플릿과 웹 컨텐츠 정보를 처리하는 목적으로 설계된 소프트웨어를 뜻합니다.

웹 서버를 구축할 때 코드에 자주 보이는 {{ content }}, {% content %} 이러한 형식으로 되어있는 대부분이 템플릿 엔진을 사용하기 위해 작성된 템플릿 구문입니다.

Flask 서버를 구축하여 index.html에 {{ 7*7 }}를 작성하고 render_template 메서드로 index.html 파일을 리턴하면 49라는 결과가 웹 페이지에 나오게되는 것 처럼 Flask에서도 템플릿 엔진을 사용하기 때문에 7*7 구문이 정상적으로 실행이 됩니다.

 

SSTI 취약점을 이용한 템플릿 구분

기본적으로 모든 서버는 제각각 다른 서버와 다른 템플릿을 사용하기 때문에 언어와 템플릿 엔진에 따라 취약점을 발생시키기 위한 페이로드가 달라지게 됩니다.

어떤 템플릿 엔진을 쓰고 있는지 알기 위해서는 하단의 사진 처럼 일일히 페이로드를 삽입하여 구별할 수 있습니다.

만약 에러가 나거나 원하는 대로 작동하지 않으면 밑으로, 잘 작동하면 위로 이동하면서 어떠한 템플릿을 사용하고 있는지 어떠한 페이로드를 사용해야되는지 빠르게 파악할 수 있습니다.

 

Flask.config

기본적으로 Flask의 경우 app.n에 들어가는 대부분의 정보들이 config 클래스에 들어가게 됩니다.

만약 app.secret_key에 중요한 정보를 넣었을 때 {{ config }} 해당 페이로드를 삽입하여 config 정보를 출력하게 만들면 app.secret_key에 들어간 중요한 정보들이 나오게 됩니다.


참고문헌

me2nuk - SSTI(Server Side Template Injection) 취약점이란?

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
Cross Site Scripting (XSS)  (0) 2021.12.22
Same Origin Policy & Cross Origin Resource Sharing  (0) 2021.12.20
OWASP top 10 / 2021 업데이트 한글 번역  (0) 2021.11.22
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

Cross Site Scripting (XSS)

XSS는 클라이언트 사이드 취약점 중 하나로, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행하여 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있습니다.

 

해당 취약점은 SOP 보안 정책이 등장하면서 서로 다른 오리진에서는 정보를 읽는 행위가 이전에 비해 힘들어졌습니다. 그러나 이를 우회하는 다양한 기술이 소개되면서 XSS 공격은 지속되고 있습니다.

더보기

Cross Site Scripting의 약어는 CSS라고 불리는 것이 옳습니다. 그러나 스타일시트를 정의하는 언어인 CSS와의 중복으로, 혼동되어 사용될 수 있기 때문에 XSS로 명명되었습니다.

 

XSS 종류

Stored XSS : XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
Reflected XSS : XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS : XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
Universal XSS : 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

 

Stored XSS

대표적으로 게시물과 댓글에 악성 스크립트를 포함해 업로드하는 방식이 있습니다. 게시물은 불특정 다수에게 보여지기 때문에 해당 기능에서 XSS 취약점이 존재할 경우 높은 파급력을 가집니다.

 

Reflected XSS

대표적으로 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식이 있습니다. 이용자가 게시물을 검색하면 서버에서는 검색 결과를 이용자에게 반환합니다. 일부 서비스에서는 검색 결과를 응답에 포함하는데, 검색 문자열에 악성 스크립트가 포함되어 있다면 Reflected XSS가 발생할 수 있습니다.

Reflected XSS는 Stored XSS와는 다르게 URL과 같은 이용자의 요청에 의해 발생합니다. 따라서 공격을 위해서는 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도해야 합니다. 이용자에게 링크를 직접 전달하는 방법은 악성 스크립트 포함 여부를 이용자가 눈치챌 수 있기 때문에 주로 Click Jacking 또는 Open Redirect 등 다른 취약점과 연계하여 사용합니다.


참고문헌

 

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
SSTI 취약점  (0) 2022.01.11
Same Origin Policy & Cross Origin Resource Sharing  (0) 2021.12.20
OWASP top 10 / 2021 업데이트 한글 번역  (0) 2021.11.22
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

Same Origin Policy

한 출처로 로드된 문서 또는 스크립트가 다른 출처의 리소스와 상호 작용을 제한하는 보안 메커니즘

 

쿠키에는 인증 정보가 보관되며, 브라우저 내부에 저장됩니다. 그리고 웹 서비스에 접속할 때 브라우저는 쿠키를 헤더에 포함시켜 요청을 보냅니다. 이 덕분에 우리는 한 번 로그인하면 일정 기간동안 로그인하지 않고 바로 서비스를 사용할 수 있습니다.

 

하지만 이용자가 악의적인 페이지를 접속했을 때, 페이지가 자바스크립트를 사용해 SNS 웹 서비스로 요청을 보낸다면 브라우저는 헤더에 해당 웹 서비스 쿠키를 포함시킬 것이고 페이지는 로그인 된 이용자의 SNS로 응답을 받을 것입니다. 이렇게 되면 해커는 마음대로 페이지 사용자의 SNS에 글을 올리거나, 삭제하고, SNS 메신저를 읽는 것이 가능하게 될 것입니다.

이와 같은 문제를 방지하기 위해 동일 출처 정책, Same Origin Policy (SOP) 보안 메커니즘이 탄생했습니다.

Origin

URL구조

URL 구조에서 프로토콜 (Protocol, Scheme), 호스트 (Host), 포트 (Port)가 같으면 Same Origin

https://caffeine-melon.tistory.com의 경우

Scheme : "https:"

host: "caffeine-melon.tistory.com"
port: "443"

URL 결과 이유
https://caffeine-melon.tistory.com/manage/ Same Origin /manage/          Path만 다름
http://same-origin.com/frame.html Cross Origin "https" != "http"  Scheme 다름
https://cross.same-origin.com Cross Origin caffeine-melon.tistory.com !=
cross.same-origin.com         Host 다름
https://caffeine-melon.tistory.com:1234 Cross Origin 443 != 1234        Port 다름

 

Same Origin Policy은 같은 Origin일 경우에만 리소스를 요청하고 사용할 수 있습니다.


Cross Origin Resource Sharing (CORS)

Origin이 다르더라도 서로 리소스를 공유해야하는 상황이 생기기 마련이다.

예를 들어 수신한 메일의 개수를 메인 페이지에 출력하려면 메인 페이지(https://www.naver.com)에서 메일 서비스(https://mail.naver.com)에 관련된 리소스를 요청해야 한다.

이 때, 두 사이트는 오리진이 다르므로 SOP를 적용받지 않고 리소스를 공유할 방법이 필요합니다.

 

CORS는 HTTP 헤더에 기반하여 Cross Origin 간에 리소스를 공유하는 방법입니다. 발신측에서 CORS 헤더를 설정해 요청하면, 수신측에서 헤더를 구분해 정해진 규칙에 맞게 데이터를 가져갈 수 있도록 설정합니다.


참고문헌

mozilla - Same-origin policy

mozilla - Cross Origin Resource Sharing

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
SSTI 취약점  (0) 2022.01.11
Cross Site Scripting (XSS)  (0) 2021.12.22
OWASP top 10 / 2021 업데이트 한글 번역  (0) 2021.11.22
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

mov dest, src

src에 있는 데이터가 dest로 복사된다. 이때, 두 피연산자의 크기가 같아야 한다.

예를 들어, AX(16 비트)에 있는 값을 BL(8 비트)로 저장될 수 없다.
mov bx, ax : bx = ax

 

lea dst, addr

lea명령어는 Load Effective Address로, dst에 주소(addr)를 저장한다.

lea dst, addr : dst = addr

 

inc dst : dst값 1 증가

dec dst : dst값 1 감소
neg dst : dst = dst값의 부호 변경
not dst : dst = dst값 비트 반전

 

add dst, src : dst += src
sub dst, src : dst -= src
imul dst, src : dst *= src
and dst, src : dst &= src
or dst, src : dst |= src
xor dst, src : dst ^= src


shl dst, k : dst << k
shr dst, k : dst >> k
sal dst, k : dst << k 
sar dst, k : dst >> k

 

test dst, src

AND 논리 연산을 하지만, 결괏값을 피연산자에 저장하지 않는다.

test rax, rax : ZF=1 if rax = 0
                : SF=1 if rax < 0

test의 연산 결과는 FLAGS 레지스터에 저장된다. 두 피연산자의 AND 연산 결과가 음수이면(최상위 비트가 1이면) SF에 1을, 0이면 ZF에 1을 저장한다.

 

cmp dst, src

dst에서 src를 빼지만, 그 결괏값이 FLAGS 레지스터의 ZF와 CF 플래그에 영향을 미친다는 점에서 test와 유사하다.
dst=src일 때에는 ZF=1, CF=0이 되고, dst<src일 때에는 ZF=0, CF=1, 반대로 dst>src일 때에는 ZF=0, CF=0이 된다.

cmp rax, rdi : ZF=1 if rax = rdi
                : ZF=0 if rax != rdi
                : CF=1 if rax < rdi
                : CF=0 if rax > rdi

 

더보기

CF(Carry Flag) : 연산 수행하면서 자리올림(carry), 자리 내림(borrow) 발생하면 1이 된다.
                     unsigned 변수의 오퍼 플로우 발생 시 1로 세팅된다.
ZF(Zero Flag) : 연산 결과가 0이면 1로 세팅됨. if문 같은 조건문 만족 시 세팅된다.

PF(Parity Flag) : 패리티 체크하는 데 사용된다.
                     연산 결과 최하위 바이트의 값이 짝수일 경우에 1이 된다.
AF(Adjust Flag) : 연산결과 carry나 borrow가 3bit 이상 발생할 경우 1이 된다.
SF(Sign Flag) : 연산 결과 최상위 비트 값과 같다. Signed 변수일 경우, 양수이면 0, 음수이면 1이다.
OF(Overflow Flag) : Signed(부호 있는) 변수의 오버플로우가 발생했을 때, 1로 세팅된다. MSB(최상위 비트)가 변경될 때, 1로 세팅된다.
DF(Direction Flag) : 문자열 처리할 때, 1일 경우 문자열 처리 instruction이 자동으로 감소, 0일 경우 자동으로 증가한다.

 

jmp, jcc

jmp는 피연산자가 가리키는 곳으로 점프하는 명령어이다. jmp은 무조건 점프하고 jcc는 조건에 따라 점프를 한다는 차이가 있다. jcc는 명령어를 수행하기 전에 산술 연산을 하거나, test, cmp명령어로 바뀐 플래그를 바탕으로 점프의 수행 여부를 결정한다. jcc는 명령어가 아니라 je, jne, jg, jge, jl, jle 등 조건부 jmp를 묶어서 이르는 말이다.

jmp location
je location : equal (ZF=1)
jne location : not equal (ZF=0)
jg location : > signed
jge location : >= signed
jl location : < signed
jle location : <= signed
ja location : > unsigned
jb location : < unsigned
js location : negative (SF=1)
jns location : not negative (SF=0)

 

cmp dword ptr [rbp-0x2c], 0x47
jle   400a31

rbp 레지스터가 가리키는 주소에서 -0x2c만큼 떨어진 곳에 들어있는 값과 0x47을 비교하여, 이 값이 0x47보다 작거나 같으면(less or equal) 0x400a31로 점프한다.

 

push, pop

push와 pop 명령어는 스택에 새로운 데이터를 추가하거나 뺄 때 사용한다.

push rdi : sub rsp, 8
           : mov [rsp], rdi
스택에 새로운 데이터를 넣는 명령어는 push. 새로운 데이터가 들어가면 rsp 레지스터도 새로운 데이터가 들어간 주소를 가리켜야 하므로 rsp가 가리키는 주소에서 들어갈 데이터의 사이즈만큼 빼서 (sub rsp, 8) 데이터가 들어갈 크기를 확보한 뒤 데이터를 복사하는 과정(mov [rsp], rdi)과 동일하다.

 

pop rdi : mov rdi, [rsp]
           : add rsp, 8

pop은 push와 반대로 스택의 최상단에 있는 데이터를 빼내는 명령어이므로, 그 반대 순서로 진행하는 것과 동일한 효과이다.


참고문헌

 

 

728x90
728x90

'어셈블리어' 카테고리의 다른 글

어셈블리어 [2] 범용 레지스터  (0) 2021.11.16
어셈블리어 [1] 기초  (0) 2021.10.20
728x90
728x90

암호화 종류

암호화는 크게 3가지로 나눌 수 있다.

 

1. 대칭키 암호화

암호화 키가 1개이며 엑셀이나 ZIP파일을 암호화할 때 사용한다.

암호화 로직을 공개하고 암호화 키를 비공개하여 암호화 키를 모를 경우에 풀이 난이도가 상승하는 암호화 방식

암호화 키를 하나씩 대입하여 암호를 푸는 경우 몇백 년 정도의 시간이 걸리기 때문에 짧은 시간 내에 암호를 풀어야 할 경우에는 암호화 방식 특성상 안전하다고 생각한다.

종류에는 DES, AES, SEED 등이 있다.

 

2. 비대칭키 암호화

비대칭키는 공개키와 개인키로 2개의 암호화 키가 있다. 공개키는 말 그대로 공개된 키이며 개인키는 사용자만 알고 있는 키이다. 공개키로 암호화를 할 경우 개인키로 복호화할 수 있고 반대로 개인키로 암호화한 경우 공개키로 복호화할 수 있다. 비대칭키 암호화 방식은 공개키로 암호화하는 경우와 개인키로 암호화하는 경우로 나눌 수 있는데 공개키로 암호화했다면 데이터 보안에 중점을 둔 것이고, 개인키로 암호화했다면 안전한 전자서명을 통한 인증 과정에 중점을 둔 것으로 해석할 수 있다. 비대칭키의 대표 알고리즘은 RSA, 디피-헬만, 타원곡선 암호 등이 있다.

 

3. 단방향 암호화 (해시)

단방향 암호화는 보통 검증을 위해 사용하거나 평문을 모르게 하기위해 사용한다. 1비트만 달라져도(일부러 같은 해시값을 가지도록 조작하기 힘듬) 단방향 암호화 결과값이 달라지기 때문에 파일의 유효성을 검증하는데 사용한다.

해시는 암호문을 평문으로 복원할 수 없기 때문에 평문을 알아낼 필요가 없는 곳에 쓰이는데 대표적으로 사이트 비밀번호를 함호화 하는데 쓰인다.

레인보우 테이블 솔트


참고문헌

구글과 파이썬으로 시작하는 보안

728x90
728x90

'암호학' 카테고리의 다른 글

중국인의 나머지 정리  (0) 2022.03.01
공개키암호 RSA  (0) 2022.02.06
블록암호 DES  (0) 2022.01.31
블록암호 AES  (0) 2022.01.25
암호의 역사  (0) 2021.11.04
728x90
728x90