스터디 일지 #2

이예은·2022년 4월 10일
0

스터디 일지

목록 보기
2/3

해당 Velog는 공부하면서 개인적인 정리 목적으로 작성한 것으로, 다른 곳에서 참고하거나 인용한 내용이 다수 포함되어 있습니다.

저번 주에는 모의 해킹 실습 환경 구축을 위한 칼리 리눅스 환경 조성 위주로 공부했었다. 그런데,,, 이제,,, 클라우드로 조성한 것도 접속이 제대로 안돼서(...) 조금 마음이 꺾이고 VMWare에 가상 머신을 추가해 두었다. 그러므로 다음 실습 및 공부 일지는 VMWare Kali Linux 환경에서의 실습 등이 위주가 되지 않을까 싶다...

여하튼, 정말 열심히 여러가지로 시도를 해 봤는데 또 실패해서 마음이 꺾였다. 연속으로 칼리를 만지다가는 마음이 더 꺾일 것 같았다. 그래서 이론 위주의 책을 집어들었다.

사실 나는 이 책이 전반적인 취약점 진단에 대해 다루는 책인 줄 알았는데, 알고 보니 웹에 대한 내용이 메인이었다. 그러나 일단은 기초편과 같은 부분에서는 범용적으로 유용한 내용이 많아 기초편 위주로 공부했다.
이하는 공부한 내용을 정리한 것으로, 책 위주로 공부하였다.


1. 취약점 진단이란

프로그램을 만들 때, 기본적으로 만드는 사람이 원하는 목표가 있다. 이떄 제대로 만들어진 프로그램이라면 우리가 원한 대로, 의도한 동작을 수행할 것이다. 그러나 문제가 발생할 수도 있다. 프로그램이 중간에 멈추거나, 의도하지 않은 동작을 수행하는 것이다. 이처럼 프로그램이 잘못 작동하는 것을 "버그" 라고 한다.
이러한 버그들 중에는 피해를 주지 않고, 그저 의도한 동작을 수행하지 못하게만 하는 것도 있지만 어떨 때에는 실제로 로그인하지 않아도 로그인이 가능하게 하거나 정보를 쉽게 빼낼 수 있도록 하는 것도 있다. 이처럼 악용 가능한 버그를 취약점이라고 부르며, 유명한 취약점으로는 SQL 인젝션과 크로스 사이트 스크립팅과 같은 것들이 있다.
취약점 진단이란 버그를 발견할 때 테스트를 하는 것처럼, 취약점을 발견하기 위한 테스트 방법을 뜻한다. 이때 보안 수준을 높일 수 있는 기능이 제대로 구현되지 않거나, 잘못 사용되는 것인 '보안 기능 미흡'도 발견해낼 수 있다. 취약점 진단을 보통 보안 테스트로 번역하는데, 가끔 침투 테스트로 번역하는 경우도 있다. 그러나 침투 테스트는 일반적으로 발견한 취약점을 이용해 실제 침투가 가능한지도 확인해본다는 점에서 차이가 있다. 그러나 취약점 진단과는 다르게 모든 취약점을 점검해보는 것은 아니라는 점에서 차이가 있다.

취약점 진단은 진단할 대상에 대해 구분되는데, 주로 플랫폼과 웹 응용 프로그램에 대해서 진단한다.

  • 플랫폼 취약점 대응

플랫폼에서는 주로 취약점이 있는 오래된 버전을 사용해 이미 알려진 취약점이 있는 경우기술 지원이 종료되어 수정되지 않는 경우, 혹은 설정이 미흡하게 되어 있어 취약점이 발생하는 경우 를 주로 대응하며, 이를 수정하기 위해 최신 버전으로 업데이트하거나 설정을 수정하는 등의 대응을 취하는 경우가 많다. 이 외에도 안전하지 않은 프로토콜 사용, 취약한 암호 사용 등으로 인해 문제가 발생할 수 있고, 이를 해결하기 위해 SSH 프로토콜을 사용하거나 공개 키 인증을 사용하는 등의 대응 방법을 취하기도 한다. 이런 취약점에 대응하기 위해서는 보안 스캐너를 활용해 취약점을 확인하고 대책을 마련하는 경우가 많은데, 보안 스캐너는 Nessus나 OpenVAS, Retina 등이 있다.

  • 웹 프로그램 취약점 대응

어떤 시스템을 웹 응용 프로그램으로 만들 때에는 주로 CMS나 그룹웨어와 같이 패키지화된 제품을 사용하거나, 신규 개발 또는 패키지 제품을 커스터마이즈한 웹 응용프로그램을 사용한다. 패키지화된 제품을 사용하는 경우에는 대체로 관리가 잘 되고 있기 때문에 플랫폼 취약점 대응과 같은 방식으로 대응할 수 있지만, 후자의 경우 보안 대응을 스스로 해야 한다. 따라서 적절한 보안 요건의 정의를 수행하고, 이를 기반으로 적절한 설계 및 구현을 하며 취약점 진단 과정을 여러 번 거쳐 보안 대책을 수립하고 수행해야 한다.

이 책에서는 주로 신규 개발이나 기존 제품을 수정한 응용프로그램에 대한 취약점 진단 방법을 다루고 있다.


HTTP

네트워크 통신을 위해서는 정해진 절차와 데이터 형식을 지켜야 한다. 이것을 규격화하여 정해둔 약속을 프로토콜이라고 하며, http는 웹에서 주로 사용되는 프로토콜이다. 이외에는 WebSocket이나 QUIC같은 웹 프로토콜이 있다. 사실 필자는 파이썬으로 실습을 하면서 WebSocket만 짧게 공부했어서 조금 새롭다...

인터넷을 포함해 일반적으로 사용되는 네트워크는 TCP/IP라는 프로토콜을 이용해 통신을 한다. HTTP도 그중 하나고, 일반적으로 들어봤을 IPv4이나 DNS도 TCP/IP에 포함되어 있다. 즉 TCP/IP는 인터넷에 관련될 프로토콜을 모은 것으로, TCP/IP 프로토콜 SUITE라고 부르기도 한다. 아머리아파

TCP/IP에는 '계층'이라는 개념이 있다. 이는 응용프로그램 계층, 전송 계층, 네트워크 계층, 연결 계층의 4계층으로 이루어져 있다.

tcp/ip 프로토콜을 통해 통신할 때에는 계층을 따라 통신을 수행한다. 출발지에서 응용프로그램 계층으로 시작해 점점 내려가며 도착지에서는 점점 올라가 응용프로그램 계층으로 도달하게 된다. 출발지에서는 각각의 계층을 지날 때 해당 계층에서 필요한 헤더 정보는 추가하고, 도착지에서는 올라가면서 점점 헤더 정보를 제거하게 되는데, 이러한 일련의 과정을 캡슐화라고 한다.

이런 TCP/IP 프로토콜에서 HTTP와 가장 관계가 깊은 프로토콜로 IP, TCP, DNS 프로토콜이 있다.

  • IP 프로토콜

계층으로 따지자면 네트워크 계층에 해당하며, Internet Protocol이라는 이름에 걸맞게 인터넷을 사용하는 모든 시스템은 이 프로토콜을 사용하고 있다. IP 프로토콜은 패킷을 상대방에게 전달하는 역할을 하는데, 그중에서도 위치를 나타내는 IP 주소의 역할이 크다.
네트워크 장비들은 목적지에 도달하기 위한 대략적인 행선지만 알고 있고, 인터넷의 전체 주소를 상세하게 파악하고 있지는 않기 때문이다.

  • TCP

TCP는 전송 계층에 해당하며, 신뢰성을 담당하는 Bite Stream을 사용한다. 바이트 스트림은 1Byte를 입출력 할 수 있는 스트림으로, 인코딩 하지 않고 원래의 바이트 형태로 전송한다는 것을 의미한다. 커다란 데이터를 보내기 쉽도록 바이트 스트림은 TCP 세그먼트라는 단위의 패킷으로 작게 나누어 전송을 하는데, 이때 각 패킷에는 번호를 붙여 누락되는 패킷이 없도록 하고 신뢰도를 담보한다. 또한 TCP는 패킷에 플래그를 갖게 하는데, 이를 이용해 몇가지 기능을 사용할 수 있다. 또한 TCP는 상대방과 확실하게 통신하기 위해 Three-way handshaking이라는 방법을 사용해 통신을 개시한다.

  • DNS

네트워크를 이용하는 컴퓨터는 IP 주소와는 별개로 호스트 이름 www를 붙일 수 있다. 여기에 도메인 이름을 붙여 주소를 지정할 수도 있다. 이처럼 도메인명과 호스트명을 생략하지 않고 모두 기술하는 형식을 FQDN이라고 한다. DNS는 이러한 호트스 이름이나 도메인 이름, IP 주소의 이름 변환을 제공한다. 예를 들어 www.google.com 의 IP 주소는 cmd창에서 ping을 사용해 보니 142.250.196.100라고 나온다. DNS는 내가 www.google.com의 ip 주소를 알고 싶다고 할 때 142.250.196.100이라고 알려주고, 이때 알아낸 ip 주소를 이용해서 우리가 웹 서버에 접속할 수 있게 만든다.

예를 들어, 우리가 A라는 웹 페이지를 보고 싶다고 하자. 그러면 일단 dns를 통해 이 사이트의 ip 주소를 알아낸 다음, http를 통해 웹 서버에 보낼 메세지를 작성하고, tcp가 이를 패킷으로 분리한다. 이를 ip가 웹 서버의 위치를 찾고 중계하여 전달하고, A의 서버에서는 tcp가 우리가 보낸 패킷을 모두 받아 http가 요청된 내용을 처리하고, 같은 과정을 거쳐 응답을 우리에게 다시 전달해 준다.


네트워크 관련 내용은 너무 기가 빨린다...

참고
「웹 보안 담당자를 위한 취약점 진단 스타트 가이드」, 우에노 센

profile
Testing leads to failure, and failure leads to understanding.

0개의 댓글