- 6
- 이니스프리
- 조회 수 775
안녕하세요?
최근 상당수의 그누보드(아미나) 계열 사이트에서 매크로를 이용한 일종의 DDoS 사건이 발생했다고 알고 있습니다.
그 방식은 간단한데, 1초당 5개 이상의 동일한 글을 반복하여 작성하여 게시판을 덮어버리고, 결국에는 서버 과부하를 유도하는 방식입니다.
저도 앞으로 아미나를 활용하여 커뮤니티 사이트를 운영할 예정인데,
1) 어떤 방식으로 이런 공격을 수행했고, 2) 이에 대한 대처방법에 대해 궁금해서 여쭤보게 되었습니다 ^^
우선 공격수행방식에 대해 질문 드리겠습니다.
제 생각에는 AutoHotkey로 브라우저를 조작하면 이 정도 속도가 나오기 힘들기 때문에
브라우저가 아닌 툴(파이썬 Requests 등)로 글쓰기 POST 요청을 반복하여 보내는 것 같습니다.
그런데 단순히 Requests에서 글 작성 스크립트를 반복해도 초당 5개 이상 작성하기는 힘들겠죠.
제가 테스트해보니 순수하게 반복문만 사용하면 기껏해야 초당 1개 정도의 속도가 나오는 것 같더군요.
(아미나에서는 ajax filter 등을 거치기 때문에 POST 요청을 여러 번 해야 글 작성이 가능합니다.)
아직 제가 멀티 프로세싱이나 멀티 스레딩에 대한 개념을 확실히 잡지를 못 했는데,
Requests에 멀티 프로세싱 등을 활용한 공격이라고 생각하면 될까요?? ㅠㅠ
이러한 공격에 대해 일부 사이트에서는 클라우드 플레어로 Requests 등 브라우저에 의한 접속이 아닌 경우 차단을 하도록 조치를 했습니다.
하지만 제가 테스트 해보니 저번에 말씀드린 Selenium의 세션을 Requests로 보내는 방식으로 어렵지 않게 우회가 가능하더군요 ㄷㄷ
https://studyforus.com/study/647489
두 번째로는 일부 사이트에서 글 쓰기 간격을 조절했다고 합니다.
제가 조금 놀랐던 부분은 이 부분 또한 공격자가 우회를 했다는 것입니다.
아미나의 코드를 뜯어보니 write_update.php 파일의 다음과 같은 부분이 이에 대한 방어를 하는 스크립트인 것 같습니다.
권한이 없는 이상 서버 내부의 세션을 클라이언트가 변조할 수는 없다고 알고 있습니다.
그렇다면 1) 세션을 생성하고 종료하는 것을 반복하거나, 2) 세션을 여러 개 생성하여 이걸 우회했을 가능성이 높은데요.
멀티 프로세싱이나 멀티 스레딩으로 세션을 여러 개 생성하여 초당 5개 이상의 글을 작성하였다고 이해하면 될까요??
제가 파이썬 멀티 태스킹에 대한 지식이 부족하여 이 부분이 잘 이해가 안 되네요 ㅠㅠ
그렇다면 이를 방어하기 위해서는 (현재시간 - 최근 글 작성 시간)을 직접 계산해야 될 것 같네요.
다만 아미나 자체적인 회원의 최근 작성글을 조회하는 기능은 DB를 검색하는 것이라서 서버에 부담이 되고 속도도 느리더군요 ㅠㅠ
그렇다면 어떤 방식으로 이걸 방어해낼 수 있을까요??
개인정보에 최근 글 작성 필드를 생성하고 이를 글을 작성할 때마다 확인하고 갱신하는 방식으로 커스텀을 하면 될까요??
이러한 방식을 사용했을 때 예상되는 문제점은 없을까요??
일련의 사태를 겪다보니 공격보다 방어가 훨씬 어렵다는 것을 느끼게 되었네요.
적절한 방어를 하려면 우선 공격방법에 대해 정확히 파악을 해야되니깐요 ㅠㅠ
스포어의 보안 고수님들의 우문현답을 부탁드립니다!!
번번이 정말 감사합니다 ^-^
작성자
댓글 6
상세한 답변을 해주셔서 감사드립니다!
말씀해주신 부분에 대해 검색을 해봤는데 제가 추가로 궁금한 점에 대해 여쭤볼게요 ^^
특정 IP에서 짧은 시간에 많은 요청이 들어오는 경우에 대해 block을 하는 방식으로 iptables를 설정하는 방법이 전부라고 보면 될 거 같아요.
=> 제가 외부 IP에 대한 개념이 부족한데, 이런 방식으로 IP를 블럭하면 같은 공유기에서 다수의 인원이 접속하는 경우(회사, 원룸 등)마저 오인하여 문제가 발생하지는 않을까요??
selenium 등을 감지하는 로직과 javascript 를 사용해서 짧은 시간에 많은 데이터를 입력하거나 별다른 마우스 움직임이 없는 등의 정보들을 가지고 차단하는 방법
=> 클라우드 플레어에서도 자바스크립트를 렌더링하는지 여부로 Requests를 필터링하는 것 같던데요.
구글링을 해보니 Requests를 감지하는 방법에 관한 https://stackoverflow.com/a/54361531 이 글을 보면 다음과 같은 부분이 있는데요.
"Javascript should be enabled.
Check that "navigator.plugins" and "navigator.language" are set in the client javascript page context"
Requests의 설정에 이런게 있는가요?? 제가 구글링을 해도 이 부분을 잘 모르겠네요 ㅠㅠ
만약 공격자가 자바스크립트를 활용하여 봇을 감지하는 방법마저도 우회를 하고, 캡챠도 머신러닝을 이용한 OCR로 뚫어버린다면,
관리자가 24시간 상주하며 직접 차단하는 방법 이외에는 사실상 방어수단이 없다고 봐도 될까요?? ㅠㅠ
정확한 공격방법을 모르면서 방어를 해야되니 방어수단을 강구하는게 훨씬 어려워지는 것 같네요.
그럼 humit 님께서도 편안한 저녁 되세요!
다시 한 번 감사드립니다 ^^
제가 외부 IP에 대한 개념이 부족한데, 이런 방식으로 IP를 블럭하면 같은 공유기에서 다수의 인원이 접속하는 경우(회사, 원룸 등)마저 오인하여 문제가 발생하지는 않을까요??
=> 이런 경우에는 하나의 IP로 잡히는게 맞습니다. 근데 저런식으로 접근을 할 수도 있지만 하나의 공유기로 여러 디바이스를 통해 공격을 시도하는게 매우 쉬운편이니까요.
Check that "navigator.plugins" and "navigator.language" are set in the client javascript page context"
=> 이 부분은 requests 모듈보다는 selenium 상의 모듈 상에서 감지가 되는 것을 의미하는 것일수도 있고, 아니면 form 요청을 보낼 때 해당 정보를 난독화해 포함한 상태로 보내는 경우일 수도 있습니다. fingerprint.js 라고 해서 해당 정보를 포함하는 라이브러리가 있습니다.
만약 공격자가 자바스크립트를 활용하여 봇을 감지하는 방법마저도 우회를 하고, 캡챠도 머신러닝을 이용한 OCR로 뚫어버린다면,
관리자가 24시간 상주하며 직접 차단하는 방법 이외에는 사실상 방어수단이 없다고 봐도 될까요?? ㅠㅠ
=> 네 아무래도 직접 관리하지 않는 이상 제대로 된 방어 수단은 없다고 볼 수밖에 없습니다. 당장 구글과 같은 경우에도 크롬 창에서 직접 검색해서 자료를 찾으면 가끔씩 봇 여부를 묻는 캡챠가 뜨는 걸로 보더라도 사용자와 봇을 구분할 수 있는 방법은 자동화 방식으로는 불가하다고 볼 수 있을 거 같습니다.
제가 오늘 접촉사고가 나서 답장이 늦었네요~ ㅠㅠ
(주차해놓은 제 차를 다른 차량이 긁어서요 ㅠㅠ)
상세한 설명 감사드립니다!
humit 님 덕분에 이제 좀 개념이 잡히는 것 같네요~
그럼 즐거운 주말 되시고 코로나19 조심하세요 ^-^
가끔은 단순 무식한 방법이 편할 때가 있습니다.
구글 리캡챠 적용해보시면 어떨까요? ^^;
리캡챠가 가장 간편하면서도 확실한 방법이긴 하네요!!
다만 클플이나 리캡챠는 워낙 유명한 툴이어서 이걸 뚫는 툴도 많은게 단점인 것 같아요~
창과 방패의 싸움인데 일단 이 부분에 대해 테스트를 해볼게요~ ㄷㄷ
그럼 편안한 저녁 되세요 ^^
감사합니다!!
그런데 단순히 Requests에서 글 작성 스크립트를 반복해도 초당 5개 이상 작성하기는 힘들겠죠.
제가 테스트해보니 순수하게 반복문만 사용하면 기껏해야 초당 1개 정도의 속도가 나오는 것 같더군요.
(아미나에서는 ajax filter 등을 거치기 때문에 POST 요청을 여러 번 해야 글 작성이 가능합니다.)
아직 제가 멀티 프로세싱이나 멀티 스레딩에 대한 개념을 확실히 잡지를 못 했는데,
Requests에 멀티 프로세싱 등을 활용한 공격이라고 생각하면 될까요?? ㅠㅠ
=> 해당 부분은 멀티 프로세싱이나 멀티 스레딩을 활용해서 동시에 글쓰는 프로세스를 실행하는 방식으로 쉽게 구현이 가능합니다.
이것을 막는 방법은 따로 없다고 보는게 맞을거 같네요.. 특정 IP에서 짧은 시간에 많은 요청이 들어오는 경우에 대해 block을 하는 방식으로 iptables를 설정하는 방법이 전부라고 보면 될 거 같아요.
두 번째로는 일부 사이트에서 글 쓰기 간격을 조절했다고 합니다.
제가 조금 놀랐던 부분은 이 부분 또한 공격자가 우회를 했다는 것입니다.
아미나의 코드를 뜯어보니 write_update.php 파일의 다음과 같은 부분이 이에 대한 방어를 하는 스크립트인 것 같습니다.
=> 세션의 경우에는 새 브라우저를 시작하면 새로 만들어지기 때문에 세션만 가지고 체크하는 것은 크게 의미가 없습니다. 좀 더 한다면 로그인을 할 때마다 생기는 세션을 DB에 저장시켜서 다른 값에 해당하는 세션들은 전부 무효화시키는 방식으로 하는 방법이 있긴하지만 이러면 DB 쪽에 부하가 많이 걸릴 수도 있어서 썩 좋은 방법은 아닌거 같네요.
가장 현실적인 방법은 캡챠를 도입해서 사용자들과 악성 유저를 귀찮게 하고, selenium 등을 감지하는 로직과 javascript 를 사용해서 짧은 시간에 많은 데이터를 입력하거나 별다른 마우스 움직임이 없는 등의 정보들을 가지고 차단하는 방법(네이버가 로그인 기능 구현에서 테스트를 해본 결과 이런 식으로 검증하는 것으로 보입니다)인거 같습니다.