코로나19가 한창 여름 내내 감염 신기록을 갈아치우던 뜨거운 여름이었습니다. 저는 한 작은 온라인 커뮤니티의 관리자들이 DoS(Denial of Service, 서비스 거부 공격)에 대항하는걸 지켜보고 있었습니다. 그들은 열정적이었지만, 작업은 그다지 효율적이지 못했습니다. 그들이 쓸 수 있는 도구라고는 웹서버 로그와 그들의 오래된 친구, iptables 뿐이었지요.
사실 보안에 투자할만한 여력이 없는 환경에서는, 이 돌대가리같은(......), 하지만 꽤나 효율적인 공격에 대항해 의존할만한 도구라고는 iptables나 nftables같은 것들 밖에는 없습니다. 하지만 일단 공격을 받고 나면, 사람들은 머리가 새하얘지죠. 로그는 너무 길고 복잡하고, 공격자 IP를 사용자 IP로부터 '발라내는' 작업은 꽤나 어렵습니다.
해서, 이런 분들을 도와드리고자 하는 순수한 목적에서 Handshake One이라고 이름붙인 작은 프로그램을 하나 만들었습니다. 이 프로그램을 이용하면 DoS 공격의 원천 IP를 빠르게 확인하거나, 아니면 최소한 현재 서비스에 어떤 IP들이 접속하고 있는지를 파악할 수 있습니다. 이 프로그램은 최근 60초동안 클라이언트 IP에서 발생하는 SYN 패킷을 수집하여 아래와 같은 보고서를 만들어냅니다:
Handshake One TCP SYN counter report(C)Copyright 2022 Robert Teminian.This application is provided free of charge, and provided AS IS: though the developer hopes that this would help the user in any way, the software does NOT guarantee anything at all.Stop by the developer's blog and leave a comment! Visit http://codenested.blogspot.com====================At 1660000053IP Hits192.168.1.26 14Total 14====================At 1660000054IP Hits192.168.1.26 11Total 11====================At 1660000055IP Hits192.168.1.26 1Total 1
현재 세 가지 운영체제에 대한 실행파일이 제공되고 있습니다만, 만일 다른 운영체제를 위한 실행파일이 필요하신 경우 제게 말씀해주세요. 아래 링크를 클릭하면 파일을 다운로드받을 수 있습니다.
- 설치: Windows
- 원하는 곳에 ZIP 파일의 압축을 풉니다
- Windows 환경에서, Handshake One은 패킷 캡쳐를 위해 npcap(https://npcap.com/) 을 사용하고 있습니다. 라이브러리를 직접 설치하시거나, Wireshark(https://www.wireshark.org/)를 설치하면 분석프로그램과 npcap을 같이 설치합니다
- npcap을 설치한 뒤, C:\Windows\Systems32\Npcap에서 Packet.dll과 wpcap.dll을 프로그램 디렉토리에 복사합니다
- 설치: Linux
- 원하는 곳에 TGZ 파일의 압축을 풉니다
- Linux 환경에서, Handshake One은 libpcap을 이용합니다. 일반적으로 libpcap은 tcpdump를 설치하면서 함께 설치되는 경우가 대부분입니다만, 만일 설치되지 않았다면 해당 리눅스 배포본의 패키지 관리자(apt, yum, ......)의 설명을 참고하여 설치해 주세요
- 환경 설정
- Handshake One의 환경을 설정할 수 있는 유일한 방법은 HandshakeOne.json 파일을 편집하는 것입니다. 현재 지원되는 설정은 아래와 같습니다
- resultpath: 보고서 파일을 저장할 디렉토리를 설정합니다. Handshake One은 해당 디렉토리에 "HandshakeOneReport.txt" 파일을 생성하고, 매 30초마다 갱신(덮어쓰기)을 수행합니다
- 리눅스를 사용하시는 경우, RAM disk 파티션(예: /tmp)으로 설정하여 시스템의 I/O 부하를 줄일 것을 권장합니다
- sniffer: 패킷을 수집할 디바이스 이름입니다. Linux에서는 일반적으로 ip link나 ifconfig 같은 명령어에 나오는 이름을 사용하면 됩니다만, Windows에서는 일반적으로 보이는 이름이 아닌 내부 디바이스 이름(예: \Device\NPF_{12345678-9ABC-DEF0-1234-567890ABCDEF})을 사용하여야 해서 설정이 조금 어려울 수 있습니다. 만일 디바이스 이름과 그에 해당하는 설명(예: Realtek PCIe GbE Family Controller)을 함께 보시려면, Handshake One을 "show" 파라미터와 함께 실행해 주세요(예: HandshakeOne show)
- reportsizelimit: 보고서 내용을 갱신할 때, 보고서 파일의 크기를 지정된 크기로 제한합니다(바이트 단위). 만일 지정된 크기를 넘어서게 될 경우, 현재 작성되는 timestamp까지의 데이터만을 작성합니다. 이를테면, 10:00:00(09:00:00~09:00:59의 데이터를 포함)에 작성되는 데이터가 1.5MB였다면 갱신시 모든 내용이 저장되고, 10:01:00(10:00:00~10:00:59의 데이터를 포함)에 작성되는 과거 1분간의 데이터가 총 2.5MB이고 10:00:47초 데이터를 쓰던 도중 보고서의 크기가 2MB를 넘었다면 10:00:47까지의 내용만을 작성 완료하고 보고서 쓰기작업을 종료한 후 10:00:02에 보고서를 갱신하게 됩니다.
- 프로그램 실행
- Windows: HandshakeOne.exe를 실행해 주시면 됩니다
- 만일 Handshake One을 Windows Service로 실행하시고 싶으시다면, nssm(http://nssm.cc/)을 이용하실 수 있을 것으로 생각됩니다. 직접 써 본 적은 없지만 평가가 꽤 좋은 프로그램이었습니다
- Linux: 두 가지 방법이 있습니다
- HandshakeOne을 직접 실행합니다. 참고: libpcap이 root 권한을 필요로 하므로, HandshakeOne은 sudo나 su 등을 이용하여 root 계정으로 실행되어야 합니다
- Handshake One을 systemd service로 설정할 수 있습니다. HandshakeOne.service 파일을 필요에 따라 편집하시고(최소한 ExecStart 와 WorkingDirectory가 현재 프로그램의 위치를 반영하게끔 조정되어야 합니다), 아래의 명령을 참조하여 프로그램을 systemd service로 등록해 주세요
- sudo cp systemd.service /etc/systemd/system
- sudo systemctl enable HandshakeOne
- sudo systemctl start HandshakeOne