slide-image


웹 보안

[2019-1]

#01

첫 포스팅-!


웹 해킹 1주차입니다. 일단 먼저 웹 기초 지식부터 정리하자면,


WWW(World Wide Web)은 인터넷 상에 분산되어 있는 정보들이 연결되어 제공되는 인터넷 서비스로, URL, HTTP, HTML으로 이루어진다.


여기서 URL은 Uniform Resource Locator의 약어로, 네트워크 상의 자원(정보)의 위치를 나타낸다.

https://news.naver.com/main/main.nhn?mode=LSD&min=shm&sid1=1105를 예로 들자면, 

빨간색은 사용중인 client로 사용중인 프로토콜의 정보이며, 웹서버 이용시 http를 이용한다. 주황색은 현재 접속중인 웹 서버의 주소이고, 파란색은 보통 파일 디렉토리를 나타내고, 여러가지 소스파일로 구성되지만, 보안 상 실제 디렉터리를 자세하게 제공하지는 않는다. 파란색은 정보자원의 이름이나 파라미터를 통해 웹 어플리케이션으로 전달되는 것들을 나타낸다. 


url에 표시되는 #HTML 태그나 경로 <a herf=’주소’>같이 특정 주소로 갈 수 있는 것을 나타낸다. 이걸 특정 참고 시점(anchor)라고 이야기 하고, html 문서에서 북마크 처럼 활용 가능하다.

?는 특정 검색어로 해당 페이지에 접속한 경우나 로그인 상태에서 접속한 경우 나타나고, &는 여러 개 있을 때 나타난다고 한다.


HTTP는 www에서 정보를 주고받을 때 사용되는 프로토콜이고, 80번 포트를 사용하다. 


HTTP Request는 사용자가 서버에게 요청하는 것이고, 크게 헤더와 본문으로 구성된다. 헤더와 본문을 구분하기 위해 공백부분이 들어가며, 헤더는 메소드와 요청 헤더로 구성된다 . 메소드는 사용자가 서버에 요청하는 메소드로 GET, POST 등이 있고, http 버전(0.9, 1.0, 1.1 등)응 확인할 수 있다. 요청헤더에는 서버에 전달하는 사용자의 정보들이 있으며, 본문에는 메시지의 내용이 들어있다. GET 메소드는 요청정보가 URL에 포함되므로, 메시지 본문을 사용하지 않는다. HTTPrequest 메소드의 종류에는 PUT(자원 생성), DELETE(자원 삭제), GET, POST(자원 요청)등이 있다.


GET과 POST는 전송방식과 데이터양, 데이터 타입, 속도, 보안성 등에서 차이가 있고, GET이 데이터를 URL에 포함하여 전송하고, 데이터양은 255자로 제한이 있으며, 아스키 형태의 데이터만 허용하고 속도가 빠르다. POST는 본문에 데이터를 첨부하여 전송하고, 데이터양이나 타입에 제한이 없고, 속도가 느리며 보안성이 GET보다는 안전하다.


HTTP Response는 똑같이 헤더와 본문으로 구성되는데, 헤더에 상태코드와 응답 헤더가 있다. 상태코드는 사용자 요청에 대한 서버 처리결과를 나타내고, 응답헤더는 전달한 데이터의 정보를 나타낸다. 500번대는 서버 측 에러가 발생했음을 의미하지만, 요새는 클라이언트 측이 오히려 이 상태코드로 정보를 얻을 수 있어서 사용하지 않는다.


HTML은 Hyper Text Markup Language로 가장 단순한 웹 언어이고, 웹의 구조적인 의미를 나타내며, http를 통해 송수신된다. 다른 언어에서 DOM(document object model)을 이용하여 HTML 객체에 접근 가능하다고 하는데, DOM은 객체 지향 모델로 구조화된 문서를 표현하는 형식이다. HTML문서의 요소들에 접근가능하도록 구성되며, 데이터를 동적으로 화면에 접근하거나 변경이 가능하다.


웹이 정적인 방식으로 돌아간다면, 웹 서버 사이 전달되는 값들의 변조가 어렵고, 마우스 클릭이나 입력 등의 로직을 이용한 작업이 불가능하다. 따라서 동적인 웹 서비스를 위한 스크립트 언어가 필요하다.


스크립트 언어의 종류를 살펴보자면, SSS는 Server Side Script로 서버 측 스크립트 언어로 서버가 이해할 수 있는 언어이다. asp, jsp, php같은 동적인 페이지를 제공하고, 보안 상으로 사용자와 브라우저에게 SSS 코드를 제공하지 않으며, 따라서 DB 연결도 SSS 코드와 한다.


CSS는 Client Side Script로 클라이언트 측 스크립트 언어로, 클라이언트가 직접 이해하는 언어이다. 주로 HTML안에 존재하며, Javascript나 visual basic script이다. 


이처럼 SSS와 CSS를 구분하는 이유는 앞에서 말했듯이, 보안상 취약점이 될 수 있는 부분은 사용자 측에서 보지 못하게 SSS로 제공하며, 서버 측 언어만 DB로 연결이 가능하다. 또한 사용자 이벤트는 사용자가 원하는 바를 브라우저에 적용해야 하므로, CSS에서만 관리 가능하다. 그리고 글자 크기가은 사소한 것들의 처리를 클라이언트에 맡겨서 서버의 불필요한 처리작업을 감소시킨다.


http는 클라이언트가 서버에 요청을 하고 서버가 클라이언트에 응답을 보내면 접속을 끊으며, 통신이 끝나면 상대 정보를 유지하지 않아 저번에 요청한 애인지 새로 요청하는 애인지 구별하지 않는다. 따라서 서버가 클라이언트를 식별하기 위해 Cookie와 Session을 사용하는데, Cookie는 Set Cookie 메소드를 통해 서버가 클라이언트 쿠키의 번호를 지정해 클라이언트를 인식하는 방법이다. 클라이언트에 번호가 부여되므로, 클라이언트 자체가 정보를 가지고 있으며, 이후 요청 때 클라이언트가 발행된 쿠키를 제시하며 서버와 접속한다. 이와 달리 Session은 서버 메모리에 저장되는 정보로, 쿠키와 달리 정보가 노출되지 않는다. 똑같이 토큰 형식으로 쿠키처럼 저장이 된다.


http 프록시는 http 요청과 응답을 중간에서 가로채 변조, 수정, 조작이 가능하게 하는 서버이다. 앞으로 웹 프록시 프로그램으로는 버프 스위프트를 사용할 것이며, 칼리 리눅스에서는 기본적으로 제공되어 있다. 앞으로 칼리에서 dvwa로 환경을 구축해서 실습을 할 것이다.


dvwa란 Damn Vulnerable Web App의 줄임말로 취약한 웹 애플리케이션 환경으로 구성된다. 각 난이도에 맞는 시큐어코딩이 되어 있어 단계별로 학습하기 좋은 어플리케이션이라고 한다. DVWA는 Apache/MySQL/PHP환경으로 구성되어있어 APMSETUP을 이용해 환경을 구축할 수 있다.


일단은 칼리와 xampp, dvwa를 설치해야 했는데, 칼리 리눅스는 있었고 xampp와 dvwa를 설치해야 했다. xampp를 설치하기 위해서 파리어폭스에 apache에 접속하려 했는데, 구글이 보안성이 위험하다 그래서 제외시켜 주었다. 그런데 또 apach사이트가 보안이 위험해서 에러가 나 구글링 해 보니까 시간을 fix하지않았다고 해서 시간 설정을 fix 했더니, 접속할 수 있었다. xampp는 5.6.23버전을 설치해주었다. 

그리고 나서 실행 권한을 부여하고 실행시켰다그러고 실행시키면 디스플레이 모드로 설치된다. next 계속 눌러서 설치 완료시킨다.

그 다음에 opt/lampp/etc/php.ini 설정파일을 실행해서 명령모드에서 /allow_url_include로 문자열을 검색해서 On으로 바꿔준다.

처음에 어떻게 실행해야 하는지 몰랐는데 manager-linux.run으로 실행하는 거였다실행했더니 프로그램 이름은 package로 되어있었다.

일단 Manage Servers에서 MySQL DatabaseApache Web Server을 켜준다.

그리고 phpMyAdmin으로 들어가서,

dvwa라는 새로운 Database를 생성한다.

그리고 저 웹사이트에서 DVWA.zip 파일을 다운받아서

unzip시키고,

/opt/lampp/htdocs/dvwa폴더에 옮겨준다.

사이트에 접속해서 보이는 빨간색 부분이 설정이 되어있지 않은 것이므로, 차례차례 설정을 해준다.

일단 캡차Completely Automated Public Turing test to tell Computers and Humans Apart의 줄임말로 사람과 컴퓨터를 판별해주는 기술이라고 한다. 일종의 시험문제를 내는 시스템이고 웹 보안성을 높여주었지만, 사용자 입장에서 귀찮은 작업을 해야 했기 때문에 시간을 단축시키면서 판독시스템을 만들었다고 한다.

아무튼 reCAPTCHA 키를 설정하기 위해 사이트에 들어가서 새롭게 추가해준다

그러면 이렇게 뜨는데, 사이트 키가 공개키라고 한다. 이 키들을 dvwa 설정파일에 입력해야 한다

설정파일 경로는 여기!

public_key를 검색해서,

아까 설정된 내용을 복사한다. 참고로 vi에서 외부에서 복사한 클립보드 내용을 붙여 넣으려면, 명령모드에서 “+p를 누르면 된다.

짜잔-

그 다음으로 저 아래 두 파일에 쓰기권한을 주려고 한다짜잔-

맨 처음 초기 설정된 id / pw admin / password라고 하는데, 접속해 보았다.

이렇게 나오면 성공. 그 다음 Create/Reset Database를 누르면 된다참고로 재부팅 시에는 /opt/lampp/lampp restart로 가동시켜야 한다고 한다.

일단 버프수트를 틀기 전에 브라우저 프록시를 설정하는 방법에 대해서 알아보자면, 저는(칼리 기본) 파이어폭스를 쓰는데 저기서 할 수 있다.

이렇게 설정을 했고, 저기 저 사용 안 함을 비워야 한다.

아직은 프록시를 키지 않고, 오늘은 브루트 포스 부터 해볼 건데, 그 창으로 이동한 다음 킬 것이다.


맨 처음에 BurpSuite를 키면, 설정 창이 나오는데, 그냥 next랑 start였나 해서 실행시키면 된다. 맨 처음 실행화면은 이렇게 되고, Proxy 메뉴에서 intercept is on으로 변환되게 눌러야 한다. intercept on은 메시지가 버프스위트에는 잡혀있지만, 서버로는 가지 않은 상태를 나타내고, off는 메시지들이 프록시를 통해 전송되며, 버프스위트 화면에 나타나지는 않는 기능이다. http는 타임아웃 기능이 없어서 장시간 on 해놓아도 괜찮다.

그럼 이제 dvwa에서 옆에 목록 중에 brute force로 이동할 것인데, 그 전에 보안 강도를 낮춰서 속도를 향상시키려고 한다. Security 에서 Low로 바꿔준다.

이제 다시 Brute Force 메뉴로 이동해서, 일부러 틀린 비밀번호를 입력한다.

그 다음 아까처럼 프록시를 브라우저에서 키고, 버프수트도 on한다. 그러면 이렇게 Options에서 잡히고, 저기 체크도 해준다.

히스토리에도 이렇게 나오는데, 최근이 밑에 쌓이는 느낌이다.(아마?) 일단 마지막 패킷을 살펴보면, 기본적으로 내가 서버에 보낸 내용은 빨간색이다. 내가 로그인 할 때 쓴 내용이 저기 보여진다!

저걸 변조하려면 이렇게 마우스 오른쪽에서 Send to intruder (Ctr+I)을 눌러야 한다.

그리고 Intrude로 들어가서 살펴보면, 이렇게 부분 부분 형광펜이 쳐져있다. 저길 바꿀거야? 라고 묻는 표시인데, 우리는 패스워드만 수정할 거니까 clear를 누른다.

그러면 모두 지워지고, pas부분만 드래그해서 add를 해준다.

그 후에 Payload 메뉴에서 Brute force로 바꾼 후 Start attack를 누른다. 밑의 Charset은 하나씩 넣어볼 문자들을 뜻하고, length는 응답 패킷의 길이를 뜻한다. password인 것을 알고 있으니 8로 맞춰준 것이고, 모르면 그냥 대충 해야지 뭐... 오래 걸리고, 되는지 확인할 거니까 8로 맞춰줬다. 브루트 포스 공격을 하다가 패킷 길이가 바뀐 것을 찾으면 이게 password구나!하는 것이다.

브루트 포스는 그냥 모든 조합을 넣어보는 공격이다. 그냥 노가다...이고 컴퓨터가 해줄 것이니 우리는 기다리면 됨ㅎ. 브루트 포스는 알파벳 순으로 대입하는 방법과, 사람들이 자주 쓰는 값으로 대입하는 딕션어리 공격이 있는데, 자주 쓸만한 값을 파일 형태로 버프수트한테 주면, 버프수트가 그걸 검색하는 방식이다. 칼리에 /usr/shar/john/password.lst 파일을 줄 것이다. 물론 딕션어리 공격은 파일에 없는 비밀번호라면 찾지 못한다.

딕션어리 공격을 하는 방법은 밑에처럼 Simple list로 설정하고, 밑에 load를 눌러서 파일을 올려준 다음에, 저 동그라미 안에 파일 내용이 들어가고, Start attack을 해준다.

생각보다 빨리 찾아버림^^.. 위에 쌩 브루트포스는 아직 나오려면 멀었다... 찾는 원리는 Length가 다른 것을 찾아야 하는데, 위의 주석 부분도 5241이라 length가 다르지만 주석과 공백은 다른 패킷(오류 처리 문구라던가)이 전송되서 그런 것일 확률이 높으므로, 다른걸 우선적으로 찾아야 하는 것 같다.


그럼 이 브루트 포스 어택 대응은 어떻게 해야할까? 사실 아까 했는데, DVWA Security에서 보안 강도를 높이는 방법이 있다. Low에서 Medium으로 바꿔주면, 응답이 느려지는데, 이렇게 Low로 되어 있는 것을

medium으로 바꿔줌

다시 Brute Force로 가서 View Source를 눌러 소스코드를 살펴보면, sleep(2)라고 시간을 지연시키는 코드가 추가된 것을 볼 수 있다.

이번엔 high로 해보았는데, 

똑같이 소스코드를 봤더니, 이번엔 sleep(rand(0, 3))으로 시간을 랜덤하게 지연시키는 것을 볼 수 있다. 앞의 medium 처럼 정해진 시간을 지연시키면, 그에 대응하는 프로그램을 만들어 버리면 그만이기 때문임.

마지막 impossible로 해보면, 

틀린 패스워드를 입력시 15분..이나 있다가 하라는 지연 화면이 보여진다. 이걸 역이용하는 방법도 있다고 한다.


일단 이번은 여기에서 끝-


 

<출처>

http://coashanee5.blogspot.com/2018/07/kali-linux-dvwa-with-xampp.html

http://vktod.blogspot.com/2015/01/ctrlc-vim.html

https://leesmain.tistory.com/category/DVWA/DVWA%3F

http://www.bloter.net/archives/214543




'EVI$I0N > 2019-1' 카테고리의 다른 글

[디지털포렌식] #02  (0) 2019.04.06
[웹보안] #02  (0) 2019.04.01
[딥러닝] #01  (0) 2019.03.25
[와이어샤크] #01  (0) 2019.03.25
[디지털포렌식] #01  (0) 2019.03.23