본문 바로가기
Computer Science/Others

공격

by Luinesse 2024. 3. 25.
반응형

이번 포스트에서는 서비스를 운용함에 있어서 발생할 수 있는 공격들에 대해서 작성하겠습니다.

 

먼저 중요 정보 유출 취약점 (Credentials Leak) 입니다. 이 공격은, 중요한 정보들을 직접적으로 유출하여 유출된 정보를 토대로 공격하는 방법입니다. 깃허브와 같은 오픈소스 저장소에 안일하게 저장하게 될 경우, 이를 통해 개인정보와 같은 중요한 정보를 얻어 공격하는 케이스가 많습니다. 깃허브의 경우 이 방법을 방지하기 위해, .gitignore 로 지정하여 저장소에 올리지 않는 방법이 있습니다. 웹 개발을 하게될 경우, 데이터 베이스의 정보 등을 config에 저장하게 될 텐데 이를 유출되지 않게끔 신경써주는 것이 좋습니다.

 

다음으로 물리 침투 공격입니다. 이 방법은 말 그대로 물리적으로 대상 PC에 접근하여 정보를 탈취하거나 백도어를 여는 등의 공격 방식으로, 사용자의 PC가 잠금상태가 아닌 채로 자리를 비우거나, 비밀번호가 간단하여 뒤에서 보는 것만으로 쉽게 알 수 있게될 경우, 위 공격을 당하기 쉬우므로 평소에 로그오프를 하는 습관을 들이고 비밀번호를 어렵고, 또 돌려쓰지 않게끔 하는 것이 중요합니다. 이 중 메일 혹은 출처가 불분명한 프로그램 설치 등을 통해서 물리 침투 공격을 당한 경우 다음과 같은 맬웨어가 설치될 수 있습니다.

  • 바이러스
  • 트로이목마
  • 랜섬웨어
  • 애드웨어
  • 루트킷

바이러스는 프로그램 혹은 파일에 심어져서 다른 파일에 전파되는 맬웨어입니다.

웜은 네트워크 통신을 통해 전파되며 네트워크를 방해하거나 시스템 성능을 저하시키는 맬웨어입니다.

트로이목마는 안전한 프로그램처럼 위장하여 시스템에 접근한 후 중요정보 탈취나 백도어를 여는 맬웨어입니다.

랜섬웨어는 사용자의 파일을 암호화하여 잠근 후 이를 풀어주는 대가로 재화를 요구하는 맬웨어입니다.

애드웨어는 웹 브라우저의 설정을 건드려 해당 브라우저를 사용할 때 마다 특정 사이트로 접속하게끔 하는 맬웨어입니다.

루트킷은 시스템 혹은 사용자가 의도하지 않은 권한을 획득하여 다른 프로세스의 감시 및 침투 하는 맬웨어입니다.

 

다음으로 무차별 대입 공격 (Brute Force Attack) 입니다. 공격자는 대상 PC에 로그인이 될 때 까지 계속해서 로그인을 시도하는 방법으로, 최근에도 여전히 유효한 방법입니다. 특히나 잘 알려진 포트의 경우 더욱 쉽게 공격의 대상이 될 수 있습니다. 이를 방지하기 위해서 포트포워딩을 통해 포트를 변경하거나, 주기적으로 로그인 시도를 검사하여 해당 IP를 차단하는 등의 방법이 있습니다.

 

다음으로 DDoS입니다. 이 방법은 정보의 탈취, 위조를 목적으로 하는 공격이아닌, 시스템에 마비를 주어 사용하지 못하게끔 하는 공격입니다. 좀비PC를 여러대를 만들어 공격 대상 PC에 접속을 시도하여, 트래픽을 많이 주어 해당 시스템을 사용하지 못하게 만듭니다. 이를 방지하기 위해 로드밸런싱을 통해 트래픽을 분산하거나, 서버를 여러개를 두는 방법, 도메인 혹은 IP를 일시적으로 변경하는 방법이 있습니다. 최근에도 종종 일어나는 공격 방법으로 이를 고려하여 서비스를 운영하는 것이 좋습니다.

 

다음으로 중간자 공격 (Man In The Middle) 입니다. 중간자 공격은 사용자와 서버의 통신 중간에서 통신 내용을 가로채서 변조 혹은 위조하여 사용자의 의도와는 다른 통신을 유발하는 공격입니다. 암호화가 안되어 있다면, 단순 패턴 파악을 공격하며, 암호화가 단순하거나 별도의 취약점이 있는 경우 취약점을 찾게 됐을 때, 공격을 시도합니다. 중간자 공격에는 다음의 공격들이 포함됩니다.

  • DNS Spoofing
  • ARP Spoofing
  • IP Spoofing
  • Session Hijacking
  • Replay Attack
  • HTTP의 취약점 이용

DNS 스푸핑은 DNS가 IP로 변환될 때, DNS 레코드를 사용하지 않는 경우 DNS 네임서버를 사용하는 것을 이용하여, DNS 네임서버와 사용자 PC 사이의 라우터에서 값을 가로채어 DNS 네임서버에 값을 변조하여 공격자의 IP로 접근하게 끔 하는 공격입니다. 이를 방지하기 위해서는 DNS 네임서버를 명시하거나, 의심스러운 AP(Access Point)에 접근하지 않는 것으로 방지할 수 있습니다.

 

ARP 스푸핑은 데이터 링크 계층에서 IP주소를 사용하여 MAC 주소를 찾는 프로토콜인 ARP 프로토콜을 이용하는 방법으로 ARP 프로토콜을 보낼 때, MAC 주소를 공격자의 MAC 주소로 설정하여 모든 통신 내용이 공격자를 거쳐서 이동하게 만듭니다. ARP 스푸핑을 방지하기 위해서는 IP 테이블의 값을 정적으로 설정하여 불변하게 만들어주는 방법으로 방지할 수 있습니다.

 

IP 스푸핑은 네트워크 계층에서 패킷을 전달하기 위해 사용되는 유니크한 주소인 IP를 사용하는 IP 프로토콜을 이용하는 방법으로, 두 PC간 통신 사이에서 상대의 IP를 패킷에 넣어 보냄으로 써 자신이 해당 IP 인척하는 공격입니다. 이를 통해 중요정보를 요구하여 정보를 빼내는 식의 공격이 가능합니다. IP 스푸핑을 방지하기 위해서는 보안이 약한 방식으로 통신을 자제하는 방법 등으로 방지가 가능합니다. (Telnet 대신 SSH 사용 등)

 

세션 하이재킹은 로그인이 이미 된 세션을 탈취하여 로그인을 하는 방법으로, 이미 ARP 스푸핑 혹은 IP 스푸핑이 성공했다고 가정할 때, 공격대상 PC와 서버의 인증이 끝난 후, 서버에 강제중단 패킷을 날려 통신을 강제로 종료한 후, 공격자와 서버간의 새로운 통신을 열어둡니다. 클라이언트는 아직 서버가 닫혔다는 패킷을 받지 못했으므로, ACK를 계속해서 보내게 되는데(TCP 프로토콜의 4-way Handshake), 공격자는 이 패킷을 받아 서버로 보냄으로써 서버와 공격자가 직접 통신하는 방법입니다. 비록 ARP 스푸핑이나 IP 스푸핑 등의 중간자 공격이 성공해야한다는 조건이 있지만, 성공할 경우 효과적인 공격방법 중 하나입니다.

 

재전송 공격은 TCP 프로토콜의 취약점을 이용한 공격으로, TCP는 UDP와 달리 안전하게 데이터를 전송하도록 보장해야하는데, 이를 위해 3-way Handshake, 4-way Handshake를 사용합니다. 이때, 도달하지 않은 패킷에 대해 재전송을 하여 온전하게 모두 도달하게 끔하는데 이를 악용하여 ACK를 받지 못한것 처럼 패킷을 한번 더 보내는 방법입니다. 이를 통해 서버는 같은 클라이언트가 두번 보낸것으로 인지하여 공격자와 서버간 통신을 가능하게 합니다. 이를 방지하기 위해서는 임의의 순서번호를 부여하여 같은 내용이 반복되는 것을 차단하거나, 타임 스탬프같은 보내는 시간 사용 혹은 임의의 난수를 패킷에 섞어 보냄으로 써 서버와 클라이언트만의 규칙을 사용하는 방법으로 방지할 수 있습니다.

 

마지막으로 HTTP의 취약점을 이용한 공격입니다. 이 방법은 기존의 HTTP(Port 80) 프로토콜이 데이터를 패킷으로 변환할 때, 암호화없이 그대로 전달되는 것을 이용하여 공격자가 중간에 이 내용을 탈취하여 HTML의 값을 변조하여 보내는 식의 공격입니다. 이를 방지하기 위해서는 HTTPS(Port 443)을 사용하는 것으로 방지할 수 있습니다. HTTPS는 기존 HTTP의 취약점을 SSL/TLS 인증을 통해 암호화하여 도착지에 도착해서 암호를 해제하는 방식으로 작동하므로 훨씬 안전하다고 볼 수 있습니다.

 

다음으로 CSRF 공격입니다. CSRF 공격은 사용자가 세션ID를 사용하는 서버에 접속하여 정상적으로 세션ID를 발급 받고, 서버에 세션ID의 정보가 담겨있을 때, 공격자는 해당 사용자를 이용하여 사용자가 서버에 공격하게끔 하는 방법입니다. 이 방법은 사용자를 이용하는 방법이라 추적이 어렵고 여러 방법을 사용하여 공격을 줄 수 있습니다. 이를 방지하기 위해서는 사용자의 요청헤더에서 Referrer를 검증하는 방법이나 CSRF 토큰을 사용하는 방법으로 방지할 수 있습니다. 여기서 Referrer란, 해당 사이트를 들어오기 바로 전의 사이트 주소를 말합니다. 정상적으로 들어온 요청이라면, 사용자가 지금 보고 있는 사이트일것이므로 이 값이 다른 값이라면 비정상적인 요청으로 처리하는 방식입니다.

 

위와 같이 클라이언트-서버 간 통신에서 정보를 탈취해서 공격하게 될 때 비밀번호와 같은 중요정보 또한 탈취되는데 이를 어느정도 방지하기 위해 비밀번호와 같은 정보는 암호화를 해서 통신하게 됩니다. 이 중 1:1 대응으로 암호화하는 해쉬 알고리즘을 사용하여 더욱 안전한 방식을 채택합니다. 해쉬 알고리즘에는 SHA-0, SHA-1, SHA-2, MD5 등이 있는데, 주로 SHA-2를 사용합니다. (다른 방법은 해쉬 충돌 가능성이 있다고 증명되었기 때문)

 

하지만, SHA-2나 MD5 등의 방법은 전부 일 방향 해시 함수로 충돌이 없게끔 설계하는데 이는 곧 단사 함수로 모든 정의역에 대한 치역을 구하고 이를 사용하여 공격하면 O(1)에 공격이 가능합니다. 모든 정의역에 대한 치역을 브루트포스하게 구하여 만든 테이블을 Rainbow Table이라고 하는데, 이를 이용한 공격을 Rainbow Table Attack이라고 합니다. 이를 방지하기 위해서는 물리적으로 긴 길이의 비밀번호를 사용하여 암호화하는것으로 방지할 수 있습니다. 하지만 너무 긴 길이의 비밀번호를 사용하는 것은 현실적으로 어렵기 때문에 암호화 값에 임의의 난수를 더해 길이를 늘리는 방법인 Salt를 통해 해결합니다.

 

다음으로 XSS(Cross Site Script) 공격입니다. 이 방법은 사이트에 입력 명령을 이용한 공격으로, 입력으로 JS내용을 입력하여 웹은 그 내용을 실제 코드내용으로 파싱하게 되어 자동으로 악성 스크립트를 실행하게 되는 공격입니다. 이를 허용하게 되면 앞서 서술한 공격들을 2차로 허용할 수 있으므로 방지하는것이 좋습니다. 방지하는 방법으로는 입력 값에 스크립트 값이 있는지 정규식을 통해서 찾거나 XSS Filter를 사용하여 <나 > 와같은 기호를 이스케이프(&lt; &gt;)를 통해 해결합니다.

 

다음으로 파일 업로드 / 다운로드의 취약점을 공격하는 방법입니다. 파일 업로드와 다운로드를 하나의 서버에서 진행하는 경우, 업로드 파일로 스크립트가 가능한 파일들을 업로드하여 다운로드 기능을 구현하기 위해 사이트에서 해당 파일을 불러오는 순간, 스크립트가 실행되면서 공격하는 업로드 취약점 공격과 다운로드 기능이 구현된 사이트에서 파일이름을 파라미터로 받아 다운로드를 구현하는 방식인 경우, 경로 구현 방식을 파악하여 파일 이름을 악의적으로 정하고 업로드 후 다운로드 받기 위해 희생자가 지정된 주소로 요청을 보낼 때, 요청된 주소를 공격자가 임의로 만든 악의적인 경로로 접속하도록 유도하는 다운로드 취약점 공격이 있습니다. 이를 방지하기 위해서 업로드와 다운로드 서버는 물리적으로 분리하고 가능한 파일을 제한해둡니다. 또한 다운로드 주소 범위를 벗어난 명령은 무시하도록 설정함으로써 방지가 가능합니다.

 

다음으로 커맨드 주입 공격입니다. 이 방법은 OS 커맨드를 직접적으로 사용하거나 런타임 환경의 언어에서 런타임을 활성화 하는 방식의 서비스를 일부 처리할 때, 공격자가 해당 공격명령을 주입하여 OS수준의 해킹을 시도하거나 런타임 수준의 해킹을 시도하는 공격입니다. 해당 방법은 OS 수준으로 해킹을 시도하므로 굉장히 치명적인 공격이 될 수 있습니다. 이를 방지하기 위해 사용자의 입력을 스트링으로 따로 처리하거나 커맨드와 입력값 사이에 파싱을 한번 더 거치는 방법으로 방지 할 수 있으나, 되도록이면 OS 수준의 명령을 사용하지않고 서비스를 운영하는 것이 가장 안전합니다.

 

다음으로 SQL 주입 공격입니다. SQL 주입 공격은 SQL의 일부 파라미터를 사용자의 값으로 받거나 동적 쿼리가 이루어 지는 경우, SQL 로직을 예상하여 비정상적인 값을 주입하여 의도치 않은 결과를 보여주거나 수행합니다. 이를 방지하기 위해서 사용자의 입력을 검증하고 처리하고, 명령이 특정되지 않을 때는 전처리를 사용하여 공격자의 의도를 회피합니다. 공격을 당하게 될 경우, 관리자의 계정을 얻게되거나 모든 사용자의 아이디, 비밀번호, 개인정보 등을 얻을 수 있습니다. 특히 비밀번호는 앞서 설명한 해시 알고리즘으로 암호화가 되어있지 않은 경우 더 큰 피해를 볼 수 있습니다. 

 

다음으로 Directory Traversal 공격입니다. 이 공격은 라우팅된 주소가 파일 이름이 드러난 경우 중요정보가 저장된 경로에 쉽게 접근할 수 있는 취약점을 제공합니다. 파일경로와 이름이 라우팅으로 사용되는 경우, robots.txt로 검색엔진이 무시해야하는 파일 경로를 작성하게끔 하는 국제 표준이 존재하는데 robots.txt는 공개적인 파일로 이에 접근하여 무시해야 하는 경로를 알아낸 뒤 정보를 탈취하는것이 가능합니다. 이를 방지하기 위해 경로접근을 미리 제어하거나 파일 경로가 드러나지 않는 라우팅을 사용하는 방법이 있습니다.

 

다음으로 악성 오픈소스 패키지 공격입니다. 이 공격은 npm과 같은 패키지 매니저에 공격자가 악성 코드나 스크립트를 담은 패키지를 혼용하기 쉬운 용어로 등록하여 이를 내려받은 사용자에게 실행되어 공격하는 방법입니다. 이를 방지하기 위해 신뢰도가 높은 패키지를 사용하고 패키지 이름 입력 실수가 있는지 확인하는 것이 필요합니다. 

 

마지막으로 프레임 워크 취약점 공격으로 프레임 워크 자체의 보안 취약점을 통한 공격으로, 최대한 안전한 프레임워크를 사용하고 최신 버전으로 유지하여 핫픽스를 받을 수 있게끔 합니다.

반응형

'Computer Science > Others' 카테고리의 다른 글

함수형 언어  (0) 2024.03.27
프로그래밍 언어와 디자인 패턴  (0) 2024.03.25