Session이란?

세션이란 쿠키와 달리 보안성이 더 높은 정보 저장 방법이다. 쿠키는 컴퓨터 내에 사용자가 사용했던 웹페이지의 로그인 정보 및 파일 정보를 저장하는데 그와 달리 세션은 서버에 정보를 저장한다. 세션이라 함은 사용자가 브라우저를 접속하고 끝내는 지점까지를 세션이라하는데 사용이 끝나는 시점까지 정보들을 서버에 저장 후 접속을 종료시 접속한 컴퓨터에 세션 키 값만을 나두고 서버에 저장 후 종료를 하게된다. 다시 해당 컴퓨터가 접속하면 그 컴퓨터는 세션 키를 가지고 있기 때문에 서버에 있는 데이터를 가져와 사용이 가능하게되는 것이다.

 

페이지 이동하기

만약 웹페이지를 만든다고 가정한다면 그 페이지에는 수많은 페이지가 숨어져 있다. 로그인 버튼을 누르면 나오는 페이지 회원가입을 하면 나오는 페이지등을 생각하시면 쉬울 것이다. 만약 그렇다면 어떠한 코드가 페이지를 이동할 때 주로 사용될까?

가장 많이 사용 되는 코드는 a 태그이다.  anchor로 닻의 약자로 단어 그 자체로 다른 페이지를 닻으로 연결하여 연결시키는 것이다.

보통 <a href="http://주소">이동하기</a> 이런식으로 사용되는데 href는 hypertext reference의 약자로 연결한 주소를 지정하는 속성이다. "이동하기"라는 것은 페이지에 이동하기를 클릭 시 해당 연결 주소로 이동하기 위해 적어놓은 것이다.

연결 방식은 2가지가 더 존재한다.

a 태그를 이용하는 것이 아닌 location.href와 location.replace를 이용하는 것이다.

이 둘을 이용하는 목적은 우리가 클릭을 해야하는 형태가 버튼 형식이거나 글자 형식 일 수 있기 때문에 클릭 하는 대상의 형태를 원하는 걸로 하기 위해 위 둘을 사용하는 것이다. location.href와 locarion.replace의 차이점은 기록이 남냐 안남냐의 차이이다. 만약 a-b-c 이렇게 연결시 a를 클릭시 자동으로 b로 연결되고 c로 연결된다고 생각해보면 우리가 실제로 보는 웹페이지는 a클릭시 c로 이동하는 것만 보일 것이다. 하지만 웹페이지 내에서는 중간 과정이 저장되기 때문에 뒤로가기 하면 b라는 페이지로 넘어가게 된다. 중간 과정을 저장하는 것이 location.href 저장 하지 않는 것은 location.replace이다. 만약 replace를 사용시 뒤로가기하면 c에서 b로 이동하는 것이 아닌 a로 바로 이동하게 된다. b라는 과정을 저장하지 않기 때문에 보여지지 않는 것이다. 그와 반대로 href사용시 b라는 페이지가 보이게 된다.

 

 

'Web > Web 개발' 카테고리의 다른 글

[php] 언어 정리  (0) 2022.04.19
JS, php언어 공부  (0) 2022.04.18
Hash 란?  (0) 2022.04.05
php 를 이용한 로그인 페이지 만들기  (0) 2022.04.03
[web] mysql database 및 table 만들기  (0) 2022.03.31

Debian이란?

오늘은 Debian에서 apm 설치하는 방법에 대해 설명드리기 위해 글을 작성합니다.

우선 Debian과 Ubuntu 중 Ubuntu가 여러분에게 많이 친숙할텐데 Debian의 경우 무료로 배포된 운영체제로 안정성을 우선적으로 만든 리눅스 운영체제입니다.

Ubuntu 같은 경우 캐노니컬이라는 회사에서 배포된 운영체제고요 다만 Debian의 핵심 유틸리티를 기반으로 만들어진것이 Ubuntu 이고 아무래도 회사에서 관리하다보니 지속적으로 새로운 기능 적용이 빠르고 Debian 작성된 파일은 다 돌아갑니다.

다만 반대로 ubuntu 기반 파일은 Deiban에서 작동하지 않는 경우가 많습니다. 그리고 안정성을 기반으로 하다보니 새로나온 패키지와 소프트웨어들은 거의 안돌아갑니다.... 

그런데 왜 사용하냐면 안정성을 기반으로하고 있다보니 서버 쪽에서 많은 인기를 끌고 있기 때문입니다. 또한 무료이기 때문에 누구나 쉽게 접근가능하다는게 장점이기도 하고요! 

그래서 저는 이번에 자료가 부족한 Debian을 위주로 글을 작성할 것입니다. 영문자료도 번역해서 최대한 도움을 드리도록 하겠습니다.

APM 설치

APM이란 Apache + php + mysql의 약자로 Apache는 웹서버 php는 웹 프로그래밍 언어 Mysql은 데이터베이스 라고 생각하시면 됩니다. 즉 호환성이 이 세 프로그램이 좋기 때문에 같이 사용합니다.

 

Apache 설치

처음에는 패키지를 최신버젼으로 업데이트 하는것으로 안할 시 제대로 설치및 진행이 안될 수 있습니다.

apt-get update
apt-get upgrade

systemctl start apache2
service start apache2

 

systemctl 과 service 는 모두 동일한 작동을하는 코드이니 둘중 아무거나 사용하시면 됩니다.

그 후 ifconfig를 이용해 ip를 확인하여 웹에 넣고 실행시 debian 웹페이지가 작동 중인게 나오게 될것입니다.

127.0.0.1 이 아이피는 대게 자기 웹서버를 지정하는 아이피로 자기 ip 대신 127.0.0.1을 입력하셔도 똑같이 나올 거예요.

 

sudo apt-get install php7.4

php는 최근 8이 나왔지만 debian에서 바로 사용하기는 무리가 있어서 7.4를 사용하시길 추천드립니다.

html이나 php 파일을 만든 후 

/var/www/html/ 여기에 저장하시고 127.0.0.1/파일명 하시면 만드신 html이나 php 코드 파일이 실행되면서 웹페이지에 나타나게 됩니다.

Mysql

Mysql은 현재 debian 상위 버젼을 사용 중 이시라면 더이상 사용이 불가합니다. 현재는 mariadb로 명칭이 변경되었고 mysql 설치시 오류가 뜰겁니다.

apt-get install mariadb-server

systemctl start mariadb

한 후 systemctl status mardiadb 하시면 정상적으로 작동되는 것을 알 수 있습니다.

다음은 웹페이지 및 작동 방법에 대해 알려드리도록 하겠습니다.

처음으로 Dreamhack을 통해 wargame을 접하게 되었는데 몇일동안 삽질을 한지 모르겠네요. 생각날때마다 코드 찾고 하느라 시간을 거의 보냈습니다.

이 글을 보는 분께 최대한 많은 정보를 주기 위해 작성하겠습니다.

 

처음 basic_exploitation_000 은 기초로 첫번째 문제 인데

이 문제의 요점을 알기 위해서는 파일을 다운받은 후 code를 분석을 먼저 해야합니다. (알집형태이니 zip 명령어로 풀어주세요)

vi basic_exploitation_000.c 명령어로 파일을 열면 아래와 같은 코드가 나오게 되는데

코드를 간단히 해석하게 되면 초기 버퍼가 시작하는 주소를 print 하고 scanf를 통해 사용자가 쓰는 문자를 최대 14byte를 받아드려 buffer에 저장 한다.

 

프로그램은 시작 된 30초 후 'Time out'이라는 문구를 남기고 exit(-1)로 프로그램을 종료한다는 의미 인데 여기서 주목해야할 점은 buffer의 크기이다.

 

buf(0x80)은 버퍼의 크기가 0x80이라는 의미 인데 0x80 16진수 즉 ascii 코드(https://huskdoll.tistory.com/988)로  10진수로 나타낼시 128byte를 나타낸다. 그런데 scanf가 141byte 까지 입력 받을 수 있다.

 

그러면 buffer의 크기 보다 많은 값을 입력시 buffer를 초과해버린다는 것인데 buffer를 넘어가면 sfp(saved frame point)와 ret(return) 의 범위까지 침범하게 되는데 ret라는 부분은 다음 명령어가 실행될 부분을 나타내게 된다.만약 buffer overflow를 통해 ret라는 영역까지 덮어쓰기를 하고 그 다음 명령어의 시작점을 buffer의 시작점으로 한 후 buffer 안에 shellcode를 를 넣어둔다면 자동적으로 shell code를 실행하여 쉘을 획득 할 수 있을 것이다.

 

출처 :&nbsp;https://shayete.tistory.com/entry/3-%ED%95%B8%EB%93%9C%EB%A0%88%EC%9D%B4-%EA%B8%B0%EB%B3%B8-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC-%EB%AA%85%EB%A0%B9%EC%96%B4?category=857069

이제 프로그램 실행시 매번 변화하는 buffer의 시작점을 따오고, 버퍼에 shell code를 넣은후 버퍼의 크기를 고려하여버퍼의 시작점을 가르키도록  ret(return)에 buffer 주소값을 입력하면 되는 것이다. 원래라면 다른 명령어가 실행할 부분으로 이동하는 주소 값이 ret에 저장되어 있다.

 

아래 코드는 위 내용을 바탕으로 작성하였다.

shell code는 26바이트를 가져왔고 buffer+sfp 크기인 128+4 = 132byte 에서 26바이트를 뺀 106 byte를 특정 값으로 채워야한다. 물론 특정 값은 의미 없는 값으로 채운다. 

중간중간 print 문을 넣은 것은 내가 정확하게 값을 추출했는지 확인하기 위해 중간중간 값을 print하도록 하였다.

 

buffer 형식은 초기  'buf = (' + 10자리 buffer 주소값 + ')' 로 구성되어 있기 때문에 recvuntil를 사용해 가운데 buffer 주소값만 가져와 buf_add에 저장후 

payload에 대입할 값은 shellcode(26byte) + 의미없는 값[\x90(A)x106](106byte) + buffer 시작점(4byte) = 136byte를 이용해 buffer, sfp, ret 값을 채웠다. 이를 프로그램에 보내게 되면 쉘이 시작되 권환을 획득하게 된다.

int형으로 변환한 이유가 출력된 buffer 주소가 char type이기 때문에 int형으로 변환하여 코드를 붙여줬다.

 

process 명령어는 서버와 동일하게 작동하는 파일을 대상으로 하기 위해 사용하였다.  성공시 서버에 적용해 보기 위해서는  process 명령어 대신 remote에 아래 host와 port를 넣어 사용하면 된다.

 

 

작동시 권한 획득 및 파일을 열어 볼 수 있다.

+ Recent posts