레트로 비비에스

호스트프로그램 설치일지 2019년 11월 27일

MinWorld blog 2020. 1. 23. 09:31

제목: 호스트프로그램 설치일지 2019년 11월 27일

이름: sysop    운영자    191129 14:00  조회:4     쪽:1/7    번호:11/14

───────────────────────────────────────

호스트프로그램 설치일지 2019년 11월 27일

 

1. 잘 구동 되나 싶었던 서버가… 이상하게 너무 느려졌다.

top 명령어로 보니… CPU 사용률이 100% ???????? 모가 문제인가?

살펴보니 전람회 호스트 메인 프로그램인 main 이 cpu를 100%까지 끌어 올리고 있었다.

이 프로세스가 하나도 아니고 계속 늘어나면서 서버가 다운될 판이다.

2. Service xinetd restart 를 해보았다.

3. 텔넷이 재시작하며 main 프로세스가 죽었고, CPU가 안정적으로 돌아왔다.

4. 하지만 곧 main 프로세스가 하나둘씩 나타나며 다시 cpu점유율이 100%가 되었다.

5. 전람회 프로그램이 문제인가? 모가 문제지?

6. Service xinetd stop을 하고 ./main 을 실행후 나와서 top을 해보았다. Cpu에 이상이 없다..

모지?

       첫번째 원인. main 프로그램이 이상하다

두번째 원인. Main 프로그램이 정상이라면 start 스크립트에 문제가 있을 수 있다. Su를 통해 bbs로 연결되는 만큼 BBS접속 종료 후 main프로세스가 정상 종료 되지 않을 수 있다.

지금이 두 가지 밖에 생각이 나지 않는다.

8. 우선 ./main 으로 실행하고 나오면 cpu에 영향이 없으므로 두번째 원인을 조사해 볼 필요가 있다.

9. /etc/xinetd.d/telnet 을 열고 server_args = -L /home/bbs/start를 주석 처리 

했다.

10. Service xinetd start

11. 텔넷에 접속해보았다. 당연히 start 스크립트를 실행하지 않으니 login 이 나온다. Bbs 계정으로 접속

12. 전람회 호스트가 정상적으로 접속되었다.

13. 로그아웃후 top로 cpu를 보니 정상이다. 역시 start 스크립트가 문제 였구나

14. /etc/xinetd.d/telnet 을 열고 server_args = -L /home/bbs/start를 주석 제거 후 Service xinetd restart

15. 텔넷 접속 한뒤 호스트 프로그램에 정상 접속 후 bye 명령어로 접속을 끊었다.

16. Top로 cpu를 보니 어라? 정상이네?

17. 하지만 1분뒤 main 프로세스가 뜨고 cpu 점유율이 높아진다… ?? 모지? 지금 이건 내가 실행한게 아닌데?

18. 누군가 텔넷에 접속을 했고 BBS에 정상 로그인이 안되는 상태에서 접속이 끊기면 main 프로세스가 종료되지 않고 CPU를 점유 하는건가?

19. 텔넷으로 접속하고 BBS에 접속하지 않은 상태에서 텔넷프로그램(이야기)를 꺼봤다.

20. Top 확인 결과.. 역시나 BBS에서 정상 종료 하지않고 임으로 텔넷접속이 끊기면 main 프로세스가 죽지 않고 CPU를 점유하고 있었다..

21. 문제는 21번, 22번, 23번 포트는 해커들의 표적 포트로 무작위 접속 및 무작위 대입 로봇이 항상 접속해서 main 프로세스가 시간이 갈수록 늘어나고 있었다.. 

22. Start 스크립트를 사용하지 않고 bbs를 눌러서 접속할때 강제로 접속을 끊어 보고 cpu를 보니 아무 이상이 없었다.

23. 즉

1) Main 프로그램은 이상이 없다.

2) Telnet 접속 후 bbs로 로그인 한뒤 호스트에 접속하여 텔넷을 강제 접속 차단

을 해도 CPU에 이상 없다.

3) Start 스크립트로 호스트에 접속뒤 bbs에 접속하고 bye나 x로 로그아웃하면 cp

u에 이상 없다.

4) Start 스크립트로 호스트에 접속뒤 bbs에 접속 하거나 접속 하지 않는 경우 모

두 강제로 텔넷 접속을 끊으면 main 프로세스가 cpu를 점유 한다….

24. 지금 난 Start 스트립트 상에 su명령어가 문제일 것이라고 생각했다. 이유는 

su는 로그아웃을 하지 않고 다른계정으로 바꾸는것이기에 강제로 텔넷 접속을 차단하

면 su exit가 정상적으로 되지 않아 main 프로세스가 남는것으로 생각이 되는데… 모

르겠다. 그럼 일단 su처럼 로그아웃을 하지 않고 계정을 바꾸는 명령어 말고 로그아웃

하고 계정을 변경하는 리눅스 명령어가 있을까?

25. 4시간이 흘렀다… 리눅스에는 su를 대신할 명령어가 없다…..

별에별 짓을 다해봤지만… 안된다.

그사이 죽지않은 main 프로세스가 40개가 넘어가고 있다…. CPU야 미안해..

26. BBS 자동 접속을 포기할까…. 고민했지만… 아니야 이건 내 고집이다.. 다른방법을 찾아보자

27. 그러던중 Top 을 계속 보고 있는데 이런 생각이 들었다. 다른 프로세스는 보통 25% 이상 점유하지 않는데 main만 50~100 을 점유한다? 그러면 한 40%이상 점유시 자동으로 프로세스를 끄는 모니터 프로그램이 있지 않을까?

28. 폭풍검색…. 

29. 두시간 후.. 아.. 없다.. 없어.. 외국 리눅스 덕후 형들은 답이 있을까? 영어로 검색 How can I automatically kill the process with the highest CPU load

30. 10분후 어라… 있다.. 이걸 차단하는 스크립트가 있다..

#!/bin/bash

Check_Repeating_Time=3; # in secondsMax_CPU_Usage='25.0'; #%Max_RAM_Usage='

2.0'; #%Log_Path='/var/log/auto_killer_log'; # path to file when killing logs will be writed

while [ 1 ]; do

ps -aux |     awk '{        Username = $1;        Proc_Name = $11;        CPU_Usage = $3;        RAM_Usage = $4;        PID = $2;        TTY = $7;

if((CPU_Usage >= '$Max_CPU_Usage' || RAM_Usage >= '$Max_RAM_Usage' ) &&  !($1 == "USER" || $1 == "root" || $1 == "daemon" || $1 == "mysql" || $1 == "avahi" || $1 == "polkitd"))        {            Func_Num_of_Ocur = "cat ./auto_killer_data | grep "PID" | wc -l";            Func_Num_of_Ocur |getline Str_Num_Of_Ocur; 

             

if(Str_Num_Of_Ocur == "0")            {                system ("echo \"\" >> /dev/" TTY);                system ("echo \"Process "Proc_Name" used to much of resources. It will be killed in '$Check_Repeating_Time' seconds if it wont stop!\" >> /dev/" TTY );                system ("echo \"\" >> /dev/" TTY);            

    system ("echo "PID" >> ./auto_killer_data.new");            }            else            {                system ("echo \"\" >> /dev/" TTY);                

system ("echo \"Process "Proc_Name" was killed because it used to much of system resources!\" >> /dev/" TTY );                system ("echo \"\" >> /dev/" TTY);  

              system ("kill -9 " PID);                Data = "date";                Data |getline Str_Data;                

system ("echo \""Str_Data"  "Username"  "Proc_Name" "TTY"\" >> '$Log_Path'");            }        }    }';

if [ -e ./auto_killer_data.new ]; then        mv ./auto_killer_data.new ./auto_killer_data    else            echo '' > ./auto_killer_data    

fi #We wait fo a while and repeate process    

sleep $Check_Repeating_Time\s;

done;

31. 살펴보니 CPU 25%라… 난 40%으로 하자 부팅때 CPU로드가 높으니까.

32. Root mysql 등등은 차단을 안하게 해놨네? 난 아파치도 추가해야지.. 나중에 BBS용 웹페이지 만들거니까. 

33. 자 실행 해보자..

34. 어맛… 넘나 좋은거… 3초마다 main 만 골라서 자동으로 죽이고 있다.

35. 그럼 이걸 서버 부팅때 자동으로 실행하게 해야지

36. Nano /etc/rc.d/rc.local 을 열어서 nohup /home/bbs/cpu.sh &  를 입력해주

37. 위에 스크립트를 /home/bbs/cpu.sh 로 저장 chmod 777 cpu.sh 해줬다.

38. 서버 재부팅

39. 텔넷으로 bbs 계속 접속, 접속 해제를 해보며 top를 봤다.

40. 3초 간격으로 main을 죽이고 있다..

41. 성공!!

42. 하………. 이문제로 또 하루가 갔다..

 43. 다른방법이 있으면 알려주세요…. 몬가 땜빵한거 같은 느낌이랄까? 만약 이 취약점을 아는 사람이라면

 44. 텔넷접속 무한으로 연결 끊기해서 서버에 무리를 줄 수 있을거 같은데.. 하지만.. 나의 CPU.sh 스크립트가 3초마다 잘 방어 하겠지… 모 서버 다운되면 다시 켜면 되지 ㅋㅋㅋ 모 중요한 BBS라고 ㅋㅋㅋ

 

https://cafe.naver.com/retrobbs/13