[웹 보안] 서비스 거부 공격 DoS(Denial-of-Service) [SYN Flooding, Ping of Death, 스머프 공격]

2024. 4. 26. 17:48·◈ Study/웹 보안(Web Security)🔐
728x90

- 서비스 거부 공격 DoS(Denial-of-Service)

1. DoS란?

공격자가 시스템의 자원을 모두 소진시켜서 다른 사람이 서비스를 받지 못하게 방해하는 공격이다. 과부하 걸리게 하는 공격이기에 많은 종류가 있고, 자주 발생하며 보통 테러의 성격을 가지고 있다.

2. 취약점 공격 DOS

일반적으로 데이터는 네트워크로 한 번에 보내지 않는다. 한 번에 전송될 수 있는 데이터는 기본적으로 1500byte 정도이다. 그 이상의 데이터를 보낼 때에는 데이터가 여러 번 전송되는 것이다.

이때 데이터의 순서가 뒤바뀌어서 목적지에 도착할 수 있으니, 데이터(패킷)을 보낼 때, 앞에 순서를 붙인다. 이때 공격자는 데이터를 조작하여 순서가 불완전하도록 한다.

정상적으로 데이터가 전송된 경우
공격자가 조작한 경우 / 패킷 순서가 중복되거나 비어있다.

 

공격자는 이렇게 데이터 순서가 중복되거나, 순서 사이에 빈 것이 존재하도록 패킷을 만들어서 공격 대상에게 전송한다. 공격 대상은 해결할 수 없는 문제를 해결하고자 무한히 시도하다가 과부하가 걸린다.

- 방어 방법

안정된 버전의 최신 운영체제(+보안 업데이트)를 쓰면 자동적으로 거의 완전한 방어가 가능하다. 취약점에 그대로 당하는 오래된 운영체제라면, 하나하나 이런 공격의 방어를 구현해주어야 한다.

2. SYN Flooding

tcp는 양방향을 지향한다. tcp로 통신을 시작할 때 일어나는 과정은 아래와 같다.

TCP 통신 과정

 

a가 syn 패킷을 보낼 경우, b가 이것을 받고 syn+ack(a에게 syn 패킷을 받았다는 ack 응답 패킷, a도 통신 준비가 완료되었는지를 물어보는 syn 패킷)을 보낸다. 그리고 a에게서 올 예정인 ack 패킷을 기다린다.

여기서 공격자는 ack 패킷을 보내지 않는다. 엄밀히 말하면, 출발지 주소를 존재하지 않는 곳으로 위조하기 때문에 ack 패킷을 받을 수가 없다. 위의 상황에서라면 b는 하염없이 a에게 올 예정인 ack 패킷을 기다리게 되며, 너무 오래기다가 timeout이 되어 자동적으로 통신 연결이 끝난다. 이때 timeout이 될 때까지 컴퓨터 자원이 소모된다.
(한 번으로는 영향이 없고, 서로 다른 곳에서 보낸 척하는 syn 패킷을 동시에 공격 대상에게 보낸다.)

SYN Flooding

 

이런 공격은 대응이 간단해 보일 수 있다. timeout 되는 시간을 짧게 줄여 최대한 빨리 공격 패킷이 무효화되길 기대할 수 있다. 그러나 단순해 보이는 대처 방법인 만큼 잘못된 대처 결과를 가져올 수 있습니다. 너무 시간을 짧게 줄여버리면, 데이터 전송이 조금 느린 컴퓨터를 가진 일반 사용자도 접근이 거부될 수 있다. 보안 관점에서는 괜찮을 지 몰라도, 사용자 경험이 안 좋아질 수 있다.

- 방어 방법

syn 쿠키라는 기술을 이용하여 효과적으로 방어할 수 있다. 공격 대상은 들어온 syn 패킷에서 연결이 정상적으로 되어 있을 때, 필요한 정보들을 쿠키 형태로 만들어 놓는다. 그리고 다시 syn+ack 패킷을 보낼 때, 이 쿠키를 첨부하여 보낸다. 즉, 공격 대상은 더이상 syn 데이터를 메모리에 담아둘 필요가 없게 된다.

만약 정상적인 사용자라면 ack 패킷을 보내줄 때, 자신이 받은 이 쿠키를 다시 첨부하여 보내줄 것이고 이를 이용해 정상적인 연결을 만들 수 있다. 보통의 경우(일반적인 운영체제)에서는 syn flooding이 의심되거나, 메모리 사용량이 크게 늘어날 경우 자동적으로 syn 쿠키가 적용된다.

4. Ping of Death

Ping of Death는 ICMP를 이용한 공격이다. (윈도우에서 흔히 사용하는 ping이 ICMP를 이용하는 것이다.)

icmp를 이용하는 ping 명령어

 

icmp는 인터넷 제어 메시지 프로토콜로, 네트워크가 잘 작동하는지 체크해주는 기능을 수행한다. 아주 간단한 역할을 수행하기 때문에 신경을 써야 할 필요가 있나 싶지만, 이를 악용하면 강력한 DOS를 할 수 있다.

공격자는 icmp 패킷의 크기를 매우 크게 조작하여, 동시에 여러 개를 공격 대상에게 보낸다. 앞서 나왔던 것처럼 네트워크 패킷의 크기는 매우 작다. 공격자의 icmp 패킷은 이동을 하면서, 여러 개의 패킷으로 갈라지게 되고, 공격 대상은 받은 여러 개의 패킷을 다시 합친다. 이 과정을 많이 반복하다보면 시스템에 과부하가 걸리게 된다.

- 방어 방법

icmp 패킷을 이용한 공격은 시스템의 방화벽에서 icmp를 차단하면 끝난다. 일반적인 패턴의 죽음의 핑 공격은 최신 운영체제에서 자동적으로 방어할 수 있도록 되어 있다. 확실하게 웹 서버에서 확실하게 죽음의 핑 공격을 방어하고 싶다면, icmp를 차단시켜 놓으면 된다.

icmp 차단


5. 스머프 공격

이 공격 또한 icmp를 이용한 공격이다. 이 공격을 이해하기 위해서는 Broadcast 주소의 특징을 알아야 한다. 브로드캐스트는 어떤 네트워크의 ip 주소 중 가장 큰 값을 말한다. 예를 들어, 라우터에 연결된 장비들의 ip 주소가 1.1.1.1, 1.1.1.2, 1.1.1.3 이런 식으로 되어 있을 때, 브로드캐스트 주소는 1.1.1.255이다.

이 브로드캐스트의 역할은 연결된 모든 시스템에 패킷을 보낼 수 있다는 것이다. 공격자는 출발지가 공격 대상인 icmp 패킷을 어떤 네트워크의 브로드캐스트 주소로 해서 보낸다. 이 패킷은 브로드캐스트의 해당 네트워크 전체에 패킷이 퍼지게 된다. 각 시스템은 icmp에 응답하고자, 출발지로 적혀있는 공격 대상에게 응답을 보낸다. 연결된 시스템이 많을 경우 위력이 커지고, 공격 대상은 원하지 않은 너무 많은 icmp 응답을 받고 마비되어 버린다.

스머프 공격


- 방어 방법

이 공격은 브로드캐스트의 역할을 제한하는 것으로 방어할 수 있다. 브로드캐스트 주소를 악용한 공격들을 막기 위해, 라우터에서 브로드캐스트 주소로 된 응답을 내보내는 것을 막는 것이다.

그럼 이 공격을 수행할 때, 공격자가 보낸 icmp 패킷은 라우터와 연결된 시스템으로 보내지지만, 시스템에서 응답한 각 패킷들은 라우터에서 지나가지 못하도록 막는다. 공격을 받는 쪽에서 할 수 있는 조치로는 죽음의 핑처럼 아예 icmp 패킷을 방화벽에서 막아버리는 것으로 방어할 수 있다.

- 참고자료

 

[지금 무료] 웹 개발자라면 꼭 알아야 할 보안 기초 | Jason - 인프런

Jason | 정보 보안은 어렵고, 너무 전문적인 내용이라고요? 아니요. 지금 당장 안전한 웹을 만들어 갈 수 있는 정보 보안 기초를 시작해 보세요!, 배워서 바로 써먹는정보 보안 기초 🖥️ 웹 개발

www.inflearn.com


728x90
'◈ Study/웹 보안(Web Security)🔐' 카테고리의 다른 글
  • [웹 보안] 세션 만료 시간 설정하기 [로그인 만료 기준(30분) 시간 초과]
  • [웹 보안] 분산 서비스 거부 공격 DDoS(Distributed Denial of Service) [DDoS 정의, 공격 방법, 방어 방법]
  • [웹 보안] 포트는 왜 중요할까? [포트와 보안의 상관 관계]
  • [웹 보안] 보안이란 무엇인가? [웹 보안의 구성, 보안에 대한 기본적인 오해]
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (937)
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (32)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (40)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (4)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (89)
        • 백준(BOJ)👨🏻‍💻 (70)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
        • 알고리즘(Algorithm)🎡 (10)
      • ◈ Study (102)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (6)
      • ◈ 공부모임 (39)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (11)
      • ◈ 자격증 공부 (37)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (113)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (44)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 태그

    꿀팁
    Oracle
    jsp
    백준
    BOJ
    일상
    html
    Java
    SQL
    spring
    Project
    javascript
    프로그래밍
    Error Note
    Database
    자바스크립트
    CSS
    코딩 테스트
    백준 티어
    코딩
  • 250x250
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[웹 보안] 서비스 거부 공격 DoS(Denial-of-Service) [SYN Flooding, Ping of Death, 스머프 공격]
상단으로

티스토리툴바