티스토리 뷰

1. 세션 하이재킹

1.1 정의


세션 하이재킹 공격은 두 시스템 간 연결이 활성화된 상태, 즉 로그인된 상태를 가로채는 것을 말한다. 서버와 클라이언트가 TCP를 이용해서 통신하고 있을 때, RST 패킷을 보내 일시적으로 TCP 세션을 끊고 시퀀스 넘버를 새로 생성해 세션을 빼앗아 인증을 회피하는 공격이다.

 

세션 하이재킹은 세션 가로채기라고 한다. 세션이 사용자와 컴퓨터, 또는 두 대의 컴퓨터 간의 활성화된 상태를 나타낸다. 가장 쉬운 세션 하이재킹은 누군가 작업을 하다가 잠시 자리를 비운 PC를 몰래 사용해 원하는 작업을 하는 것이다.

 

1.2 위험성

시스템을 침투하는 방법 중에서 가장 어려운 분야 중에 하나가 정당한 접근 권한을 획득하기 위한 패스워드를 얻는 일이다. 정당한 접근 권한을 획득한 사용자가 패스워드를 성공적으로 입력하여 로그온한 후에 공격자는 현재의 연결된 세션을 넘겨받아 그 사용자처럼 위장할 수 있다. 이렇게 함으로써 공격자는 사용자의 패스워드를 얻기 위한 노력은 전혀 필요치 않게 된다.

 

세션 하이재킹은 현재 연결중인 세션을 하이재킹하기 위한 공격 기법이다. 하이재킹을 함으로써 얻어지는 가장 큰 이점은 서버로의 접근 권한을 얻기 위한 ID와 패스워드를 사용하는 인증 절차를 건너뛸 수 있다는 것이다.

 

대부분의 컴퓨터는 취약하다. 또한 하이재킹을 막기 위한 특별한 대응책이 없다. 특정 소프트웨어를 사용하면 하이재킹은 무척 간단하다.

 

1.3 공격법

Session ID 공격

Session ID에 대한 공격은 크게 2 단계로 이루어진다. 1단계는 Session ID 취득 단계이고 2단계는 취득한 Session ID 공략 단계이다.

 

공격자는 Session ID를 취득하기 위하여 웹 서버와 웹 클라이언트의 트래픽을 직접적으로 스니핑하거나, 웹 서버 상에 공격 코드를 삽입하여 두고 사용자가 클릭할 때 null, Session ID 값을 전송받을 수 있도록 한다. 웹 서버와 웹 클라이언트 사이의 트래픽을 직접적으로 스니핑하는 방법은 일반적인 네트워크 트래픽 스니핑 기법을 통해 가능하다.

 

네트워크 트래픽 스니핑을 통한 HTTP 요청 헤더 안의 쿠키값

..comAccept-Language: koContent-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)Host: ibn.kbstar.comContent-Length: 297Connection: Keep-AliveCache-Control: no-cachenull: Session=QJ48621878865

 

웹 서버 상의 HTML 코드 삽입이 가능한 페이지는 주로 사용자가 글을 게시할 수 있는 게시판이나 자료실 등에 존재한다. 정상적인 글을 게재하는 대신 공격자는 HTML 코드 및 스크립트를 심어 넣는다. 일반 사용자는 해당 게시물을 열람하게 될 때 자신도 모르는 사이 null, Session ID 정보가 제 3 의 공격자 서버나 이메일로 전송되게 된다. (이러한 공격 기법을 Cross-Site Scripting이라고 부른다.)

 

쿠키값 탈취를 위한 HTML 삽입

<form name=f method=POST action="http//host/hello.php"><input type=hidden name="name"value="<script>alert(doc-ument.cook-ie)</script>"></form><script>f.submit()</script>

 

결과적으로 공격자는 취득한 타인의 Session ID 값을 웹 서버에 요청함으로써 HTTP Session Hijacking 공격을 시도할 수 있다. 물론 이 공격이 성공하려면 Session ID 값이 유효해야 하므로, 사용자가 로그온 한 상태에서 공격이 이루어져야 하거나 Session ID 값의 유지 시간이 긴 경우라는 제한 사항이 필요하다.

 

그러나, 기본적으로 잘못 설계된 세션 관리 기법을 사용하고 있는 웹 서버는 이러한 Hijacking 공격에 취약할 수 밖에 없다. 굳이 타인의 Session ID 값을 직, 간접적으로 취득하지 않고도 무작위 추측 대입(Brute-force Guessing)함으로써 공격이 가능하다. 공격자는 정상적인 로그인 과정시 분석한 자신의 null , 웹 브라우저의 주소창의 URL, 웹 페이지 폼 소스 hidden field 내에 노출된 Session ID 값 자체를 분석한다.

 

Session ID 생성 방식의 취약점을 파악한 후, 공격자의 컴퓨터에서 로컬 프록시 툴이나 웹 브라우저 창 URL 주소창에서 직접 Sessioion ID 값 단일 대입을 시도한다. 더 나아가 자동적인 Session ID 대입 스크립트를 작성하여 공격할 수도 있다.

 

 

네트워크 트래픽 스니핑을 통한 HTTP 요청 헤더 안의 쿠키값

..comAccept-Language: koContent-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)Host: ibn.kbstar.comContent-Length: 297Connection: Keep-AliveCache-Control: no-cachenull: Session=QJ48621878865

 

1.4 방어법

생성범위 지정

Session ID 생성 범위값을 사용자 수에 대비하여 충분히 큰 값으로 설정한다.

 

랜덤 생성

Session ID는 가능한 한 추측 불가능(random)하게 생성한다. 무작위 추측 대입 공격을 할 때 공격자는 그만큼 더 많은 시간을 투입하여야 하며 현재 연결되어 활성화 되어 있는 유효한 Session ID 값을 찾는 확률은 낮아진다.

 

주기적 생성

Session Timeout 기능과 Session ID 재생성 기능을 사용한다. 일정 시간 동안 활동이 없는 사용자는 새로운 Session ID로 재로그인 하도록 하고, 사용자 로그아웃 시에는 Session ID 값을 폐기한다. 장시간 접속이 필요한 어플리케이션의 경우에는 일정 주기마다 Session ID값을 자동으로 재생성하여 세션을 유지하도록 한다.

 

사용자 잠금 기능

무작위 추측 대입(Brute-force Guessing)에 대비하여 일정 회수 이상의 인증 실패 시에는 사용자 잠금 기능을 구현한다.

 

사용자 인증 제한

로그인 이후에도 중요한 서비스 이용 시에는 사용자 인증을 통하여 인가된 사용자만이 해당 서비스를 이용할 수 있도록 통제한다.

 

변수 암호화

null 내용 안의 Session ID와 기타 변수 값 자체를 암호화한다.

 

SSL 구현

웹 서비스 자체의 중요성에 따라 null이 전달되는 방식을 SSL로 구현함으로써 스니핑 공격에 대응할 수도 있다.

 

주기적 필터링

웹 서비스 상에 공격자가 HTML 공격 코드 삽입이 가능한 페이지가 있는지 점검한다. 직접적인 공격 코드 삽입을 차단할 수 있도록 특수 문자 및 스크립트 코드를 필터링하여야 한다.


2. 실습

2.1 세션 관리와 개인 정보 출력



모의 해킹이 가능한 사이트를 파싱해준다.


-> 아무 사이트나 타겟이 되면 정보윤리 강령에 위반되어 법적 책임을 받을 수 있다.


하지만 대부분의 웹 사이트들이 정보보호가 잘 되어 있기 때문에 더 수준이 높은 취약점 분석을 필요로 한다.




타겟이 된 사이트의 소스를 분석한 후


타겟으로 설정한 사이트의 소스 중 태그의 value에 개인 정보가 잘 할당 되어있는 것을 확인한다.


그리고 세션을 가로채기 위한 쿠키 정보를 요청한다.


con.setRequestProperty(Cookie, cookie);



요청한 쿠키의 정보를 출력해준다.


그리고 개인 정보를 깔끔하게 출력해주기 위해서


태그의 name 속성을 선택, 비교한 후 출력해준다.


temp.contains();


Wireshark를 이용하여 해당 웹 사이트에 패킷 분석이 가능한지 확인해본다.


GET 방식으로 요청이 잘 되었음을 확인할 수 있다.



GET방식으로 요청된 URI Query를 확인해보자.


매개변수들을 확인할 수 있고


아래의 드래그된 숫자 부호들은


변수들을 패킷 부호로도 복호화할 수 있음을 알게된다.


또한 반대로 암호화도 가능하다.


-> 추후에 시스템 해킹을 공부하게 된다면


어셈블리어와 같은 기계언어로도 취약점 분석을 할 수 있다.


본격적으로 세션을 가로채보자.


각 파라미터 변수들의 정보를 다음과 같이 바꿔주는 코드를 작성하였다.



동일 세션임을 확인하였다.


정보를 바꿔 주었기 때문에 새로 로그인을 시도하라고 한다.



기존의 개인정보로 로그인을 해보았으나 로그인이 되질 않는다.


세션 가로채기에 성공하였다.



수정 정보를 확인하기 위해서 다시 확인해보자.




회원 정보 수정에 들어가보니


기존의 개인정보를 포함한 세션을 가로채어


내가 원하는 개인 정보로 바뀐 것을 확인할 수 있다.


소스코드




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크