국내 리눅스 시스템 공격에 사용되는 BlueShell 악성코드 (2)
AhnLab SEcurity intelligence Center(ASEC)은 과거 “국내와 태국 대상 APT 공격에 사용된 BlueShell 악성코드” [1] 블로그에서 태국과 국내 리눅스 시스템들을 대상으로 한 공격에 사용된 BlueShell 악성코드들을 다루었다. 공격자는 백도어 악성코드인 BlueShell을 커스터마이징하여 공격에 사용하였으며 특정 시스템에서만 동작하도록 조건을 설정하기도 하였다.
해당 블로그가 공개된 후에도 동일한 공격자가 제작한 BlueShell 악성코드들이 VirusTotal을 통해 지속적으로 수집되고 있다. 공격 대상을 검사하는 조건에 리눅스 시스템의 호스트 이름을 검사하기는 하지만 해당 정보 단독으로는 공격 대상을 특정하는데 어려움이 있고 악성코드만으로는 초기 침투 방식과 같은 연관 정보는 확인할 수 없다. 하지만 id 명령어를 위장한 새로운 드로퍼 악성코드가 확인되었으며 추가 악성코드 및 C&C 서버가 확인됨에 따라 여기에서는 이전 블로그에서 언급한 BlueShell 악성코드들과 함께 추가적으로 수집된 악성코드들을 분석하여 정리한다.
1. BlueShell
BlueShell은 Go 언어로 개발된 백도어 악성코드로서 깃허브에 공개되어 있으며 윈도우, 리눅스, 맥 운영체제를 지원한다. 설명이 적혀있는 ReadMe 파일이 중국어인 것이 특징인데 이는 제작자가 중국어 사용자일 가능성을 보여준다. BlueShell은 지속적으로 국내 대상 공격에 사용되고 있으며 이전 블로그에서는 달빗(Dalbit) 공격 그룹이나 알려지지 않은 공격자들의 사례들을 다루었다. 백도어 악성코드로서 C&C 서버로부터 명령을 전달받아 공격자의 악의적인 명령을 실행할 수 있으며 이에 따라 BlueShell이 설치된 시스템은 공격자에게 제어를 탈취당하게 된다.

Figure 1. 깃허브에 공개되어 있는 BlueShell 백도어
기능 상으로 보면 단순한 형태인 BlueShell은 C&C 서버와의 통신에 TLS 암호화를 지원하여 네트워크 탐지를 우회한다. 공격자의 명령을 받아 수행할 수 있는 기능들로는 원격 명령 실행, 파일 다운로드 / 업로드, Socks5 프록시가 있다.
BlueShell은 3개의 설정 데이터를 가지고 있는데 C&C 서버의 IP 주소, Port 번호 그리고 대기 시간이다. 일반적으로 설정 데이터는 악성코드 제작 시 바이너리에 하드코딩되어 저장되며 이후 init() 함수에서 초기화 과정을 거쳐 사용된다.
2. 공격에 사용된 BlueShell 분석
2.1. 커스터마이징된 BlueShell
공격에 사용된 커스터마이징된 BlueShell 백도어는 일반적인 BlueShell과 달리 내부 바이너리에 C&C 주소와 같은 설정 데이터를 포함하고 있지 않다. 대신 실행 시 전달받은 환경 변수를 읽어 Base64로 복호화하여 설정 데이터를 구한다. 지금까지 확인된 환경 변수 이름은 “lgdt”와 “wtim”이다.

Figure 2. 환경 변수를 복호화하여 설정 데이터로 사용하는 루틴
환경 변수를 복호화하면 다음 표와 같이 4개의 인자가 차례대로 존재한다. 네 번째 인자는 동작 조건을 의미하는데 만약 인자가 네 개일 경우 리눅스 시스템의 호스트 이름을 구해 네 번째 인자로 전달받은 문자열과 비교하여 동일하지 않은 경우 종료한다. 즉 커스터마이징된 BlueShell 자체만으로는 C&C 주소나 공격 대상 시스템에 대한 정보를 알 수 없으며 이를 실행하는 드로퍼에 설정 정보가 담겨있다.
| 인자 | 설명 |
|---|---|
| #1 | C&C 서버 주소 |
| #2 | C&C 서버 포트 번호 |
| #3 | 대기 시간 |
| #4 | 호스트 이름 조건 |
Table 1. 커스터마이징된 BlueShell의 설정 데이터

Figure 3. 동작 조건 검사 루틴
2.2. BlueShell 드로퍼 악성코드
드로퍼는 실행 과정에서 내부 .data 섹션에 암호화된 형태로 저장된 BlueShell을 0x63 키로 Xor하여 복호화한다. 복호화 된 데이터는 압축된 형태이며 이를 압축 해제하고 “/tmp/.ICECache” 등의 경로에 생성한다.

Figure 4. 드로퍼의 메인 루틴
드로퍼는 이후 생성한 BlueShell을 실행하고 삭제하는데 이에 따라 BlueShell은 메모리 상에서만 동작한다. 참고로 단순하게 실행시키는 형태가 아니며 인자로 기존 경로 대신 “/usr/libexec/rpciod” 문자열을 전달하여 프로세스 조회 명령에서 정상 프로세스와 유사한 위장 프로세스 이름이 확인되도록 한다.

Figure 5. 정상 프로세스로 위장하여 동작 중인 BlueShell 백도어
이외에도 실행 이전에 설정 데이터가 담긴 환경 변수를 함께 전달하는데 이는 위에서 다룬 BlueShell 백도어가 복호화하여 C&C 서버 주소 및 동작 조건으로 사용한다.

Figure 6. 설정 데이터가 담긴 환경 변수들
2.3. 상위 드로퍼 악성코드
이번에 확인된 유형은 위의 두 악성코드뿐만 아니라 드로퍼를 생성하는 또 다른 상위 드로퍼가 함께 확인되었다. 상위 드로퍼 악성코드는 “id”라는 이름으로 접수되었으며 이름과 같이 리눅스의 “id” 명령을 위장함과 동시에 BlueShell 드로퍼 그리고 최종적으로 BlueShell 백도어 악성코드를 설치한다. 구체적인 정황은 확인되지 않지만 공격자는 지속성 유지를 위해 “id” 명령어가 위치한 바이너리를 악성코드로 변경하여 해당 명령이 실행될 때마다 악성코드가 지속적으로 실행될 수 있도록 한 것으로 추정된다.
해당 악성코드는 실행 시 먼저 자신을 읽어와 메모리에 저장한 후 자가 삭제한다. 이후 현재 실행 중인 프로세스와 동일한 이름으로 파일을 쓰고 실행하는데 이는 위에서 다룬 BlueShell 드로퍼 악성코드이다. 참고로 악성코드는 BlueShell의 위장 이름인 “/usr/libexec/rpciod” 프로세스가 현재 실행 중인지를 검사하여 그렇지 않을 경우에만 동작한다. 만약 자가 삭제에 실패한 경우에는 “/tmp/.X15-lock” 경로에 악성코드를 설치한다.
이후 다시 생성한 파일을 삭제하고 이번에는 “id” 명령을 담당하는 실행 파일을 다시 동일한 이름으로 생성하고 실행한다. 상위 드로퍼는 위에서 다룬 BlueShell 드로퍼와 달리 바이너리를 암호화하지 않고 가지고 있는 것이 특징이다.

Figure 7. 바이너리에 포함된 BlueShell 드로퍼 및 ls 명령 바이너리
결과적으로 실제 “id” 명령의 결과가 출력되며 이에 따라 사용자는 정상적으로 “id” 명령을 사용한 것으로 인지할 것이다. 여기까지의 과정이 끝나면 “id” 파일도 삭제하고 메모리에 저장한 기존 파일을 다시 동일한 경로에 쓴다.

Figure 8. 악성코드 실행 결과
만약 해당 악성코드가 “/bin/id”와 같은 정상 경로에 위치해 있다면 시스템의 다른 프로세스나 사용자가 “id” 명령을 사용할 때마다 정상적인 명령 실행 결과를 출력해 줌과 동시에 BlueShell이 실행될 것이다.
3. 확인된 악성코드 분류
여기에서는 지금까지 확인된 BlueShell 악성코드들을 정리한다. 공격자는 적어도 7번에 걸쳐 악성코드를 제작하여 공격에 사용하였으며 실질적으로 거의 유사한 형태이다. VirusTotal에서 해당 악성코드들을 업로드한 국가를 보면 공격 대상이 된 것으로 추정되는 국가는 대부분 대한민국이며 최소한 2022년 경부터 2023년까지 공격이 지속된 것으로 보인다.
| 공격 날짜 | 이름 및 경로 (Dropper / BlueShell) |
국가 | 환경변수 | 위장 프로세스 | 소스 코드 정보 |
|---|---|---|---|---|---|
| 2022-09-01 (Upload) | orbds /tmp/.ICECache |
TH | lgdt | /usr/sbin/cron -f | /home/User/Desktop/client/main.go |
| 2022-12-09 | – | KR | lgdt | – | /home/User/Desktop/20221209/client/main.go |
| 2023-02-02 | rpcd /tmp/kthread |
KR | lgdt | /sbin/rpcd | /home/User/Desktop/20230202/client/main.go |
| 2023-02-16 | – | KR | wtim | – | /home/User/Desktop/20230216/client/main.go |
| 2023-03-15 | sssd_pam.log | KR | wtim | – | /home/User/Desktop/QX20230315/client/main.go |
| 2023-11-14 (Upload) | orbds /tmp/.ICECache |
BR | lgdt | /usr/lib/systemd/systemd-udevd | /home/User/Desktop/client/main.go |
| 2023-12-21 (Upload) | id /tmp/.ICECache |
KR | lgdt | /usr/libexec/rpciod | /home/User/Desktop/client/main.go |
Table 2. 악성코드 분류
참고로 Go 언어로 개발된 BlueShell 바이너리에는 소스 코드 경로 정보가 함께 포함되어 있다. 여기에는 공격자의 작업 경로도 나오는데 몇몇 유형의 경우 디렉터리 이름을 날짜로 지정하였다. 위 표에서는 이를 기반으로 공격 날짜를 분류하였으며 해당 정보가 없는 경우에는 수집 날짜를 기반으로 하였다.

Figure 9. Go 소스 코드 경로 정보
4. 결론
최근 국내 리눅스 시스템들을 대상으로 한 지속적인 공격이 확인되고 있다. 구체적인 정황은 알 수 없지만 공격자가 직접 제작한 BlueShell 악성코드가 사용되는 것이 특징이다. BlueShell은 백도어 악성코드로서 시스템에 설치될 경우 공격자의 명령을 전달받아 다양한 악성 행위를 할 수 있다. 즉 BlueShell이 설치되었다는 것은 감염 시스템에 대한 제어가 공격자에게 탈취당했다는 것을 의미한다.
이와 같은 보안 위협을 방지하기 위해서는 취약한 환경 설정을 검사하고, 관련 시스템들을 항상 최신 버전으로 업데이트하여 공격으로부터 보호해야 한다. 또한 V3를 최신 버전으로 업데이트하여 악성코드의 감염을 사전에 차단할 수 있도록 신경 써야 한다.
파일 진단
– Trojan/Linux.BlueShell.XE216 (2023.02.20.03)
– Trojan/Linux.Agent (2023.08.26.00)
– Dropper/Linux.BlueShell.2904696 (2023.09.04.02)
– Dropper/Linux.BlueShell.2888120 (2023.09.04.02)
– Dropper/Linux.BlueShell.2904376 (2024.02.05.02)
– Dropper/Linux.BlueShell.2978160 (2024.02.05.02)